Tout d'abord, bonjour à tous!!!
Il s'agit là de mon premier message sur le forum developpez.net. J'espère que vous pourrez m'aider et pouvoir aider à mon tour.

Je vous expose mon problème.

J'ai créé une base et un mapping hibernate via hibernate tools mais je ne parviens pas a effectuer des ajouts en cascade. Par exemple, j'ai une table theme et une table image. Ces deux tables sont liées par une relation de type many-to-many porteuse d'un attribut.

Précision: j'utilise Spring

Voici le script de création des tables:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 
CREATE TABLE orientation (
idOrientation int not null auto_increment,
libelleOrientation varchar(20) not null,
PRIMARY KEY(idOrientation)
)Type=InnoDB;
 
CREATE TABLE image (
idImage int not null auto_increment, 
nomImage varchar(50) not null,
cheminImage varchar(200) not null,
descriptionImage varchar(200),
idOrientation int not null,
PRIMARY KEY(idImage),
CONSTRAINT FK_theme_idOrientation FOREIGN KEY (idOrientation) REFERENCES orientation (idOrientation),
UNIQUE(nomImage, cheminImage)
)Type=InnoDB;  
 
CREATE TABLE theme (
idTheme int not null auto_increment, 
libelleTheme varchar(50) not null, 
PRIMARY KEY(idTheme),
UNIQUE(libelleTheme)
)Type=InnoDB;
 
CREATE TABLE image_theme(
idImage int not null,
idTheme int not null,
isPrincipale boolean not null,
PRIMARY KEY(idImage, idTheme),
CONSTRAINT FK_image_theme_idImage FOREIGN KEY (idImage) REFERENCES image (idImage),
CONSTRAINT FK_image_theme_idTheme FOREIGN KEY (idTheme) REFERENCES theme (idTheme)
)Type=InnoDB;




Voici maintenant les fichiers de mapping générés par Hibernate Tools:

Image.hbm.xml
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
 
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 9 d?c. 2009 13:22:16 by Hibernate Tools 3.2.4.GA -->
<hibernate-mapping>
    <class name="com.dawns.studio.javabeans.Image" table="image" catalog="dawnsstudio">
        <id name="idImage" type="java.lang.Integer">
            <column name="idImage" />
            <generator class="increment" />
        </id>
        <many-to-one name="orientation" class="com.dawns.studio.javabeans.Orientation" fetch="select">
            <column name="idOrientation" not-null="true" />
        </many-to-one>
        <property name="nomImage" type="string">
            <column name="nomImage" length="50" not-null="true" />
        </property>
        <property name="cheminImage" type="string">
            <column name="cheminImage" length="200" not-null="true" />
        </property>
        <property name="descriptionImage" type="string">
            <column name="descriptionImage" length="200" />
        </property>
        <set name="imageGaleries" inverse="true" lazy="true" table="image_galerie" fetch="select">
            <key>
                <column name="idImage" not-null="true" />
            </key>
            <one-to-many class="com.dawns.studio.javabeans.ImageGalerie" />
        </set>
        <set name="imageThemes" inverse="true" lazy="true" table="image_theme" fetch="select">
            <key>
                <column name="idImage" not-null="true" />
            </key>
            <one-to-many class="com.dawns.studio.javabeans.ImageTheme" />
        </set>
    </class>
</hibernate-mapping>
Theme.hbm.xml
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 9 d?c. 2009 13:22:16 by Hibernate Tools 3.2.4.GA -->
<hibernate-mapping>
    <class name="com.dawns.studio.javabeans.Theme" table="theme" catalog="dawnsstudio">
        <id name="idTheme" type="java.lang.Integer">
            <column name="idTheme" />
            <generator class="increment" />
        </id>
        <property name="libelleTheme" type="string">
            <column name="libelleTheme" length="50" not-null="true" unique="true" />
        </property>
        <set name="galeries" inverse="true" lazy="true" table="galerie" fetch="select">
            <key>
                <column name="idTheme" not-null="true" />
            </key>
            <one-to-many class="com.dawns.studio.javabeans.Galerie" />
        </set>
        <set name="imageThemes" inverse="true" lazy="true" table="image_theme" fetch="select">
            <key>
                <column name="idTheme" not-null="true" />
            </key>
            <one-to-many class="com.dawns.studio.javabeans.ImageTheme" />
        </set>
    </class>
</hibernate-mapping>
ImageTheme.hbm.xml
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 9 d?c. 2009 13:22:16 by Hibernate Tools 3.2.4.GA -->
<hibernate-mapping>
    <class name="com.dawns.studio.javabeans.ImageTheme" table="image_theme" catalog="dawnsstudio">
        <composite-id name="id" class="com.dawns.studio.javabeans.ImageThemeId">
            <key-many-to-one name="image" class="com.dawns.studio.javabeans.Image">
                <column name="idImage" />
            </key-many-to-one>
            <key-many-to-one name="theme" class="com.dawns.studio.javabeans.Theme">
                <column name="idTheme" />
            </key-many-to-one>
        </composite-id>
        <property name="isPrincipale" type="boolean">
            <column name="isPrincipale" not-null="true" />
        </property>
    </class>
</hibernate-mapping>


Voici maintenant les classes générées:

Image.java
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
 
package com.dawns.studio.javabeans;
 
// Generated 9 d�c. 2009 13:22:15 by Hibernate Tools 3.2.4.GA
 
import java.util.HashSet;
import java.util.Set;
 
/**
 * Image generated by hbm2java
 */
public class Image implements java.io.Serializable {
 
	private static final long serialVersionUID = 1L;
	private Integer idImage;
	private Orientation orientation;
	private String nomImage;
	private String cheminImage;
	private String descriptionImage;
	private Set<ImageGalerie> imageGaleries = new HashSet<ImageGalerie>(0);
	private Set<ImageTheme> imageThemes = new HashSet<ImageTheme>(0);
 
	public Image() {
	}
 
	public Image(Orientation orientation, String nomImage, String cheminImage) {
		this.orientation = orientation;
		this.nomImage = nomImage;
		this.cheminImage = cheminImage;
	}
 
	public Image(Orientation orientation, String nomImage, String cheminImage,
			String descriptionImage, Set<ImageGalerie> imageGaleries, Set<ImageTheme> imageThemes) {
		this.orientation = orientation;
		this.nomImage = nomImage;
		this.cheminImage = cheminImage;
		this.descriptionImage = descriptionImage;
		this.imageGaleries = imageGaleries;
		this.imageThemes = imageThemes;
	}
 
	public Integer getIdImage() {
		return this.idImage;
	}
 
	public void setIdImage(Integer idImage) {
		this.idImage = idImage;
	}
 
	public Orientation getOrientation() {
		return this.orientation;
	}
 
	public void setOrientation(Orientation orientation) {
		this.orientation = orientation;
	}
 
	public String getNomImage() {
		return this.nomImage;
	}
 
	public void setNomImage(String nomImage) {
		this.nomImage = nomImage;
	}
 
	public String getCheminImage() {
		return this.cheminImage;
	}
 
	public void setCheminImage(String cheminImage) {
		this.cheminImage = cheminImage;
	}
 
	public String getDescriptionImage() {
		return this.descriptionImage;
	}
 
	public void setDescriptionImage(String descriptionImage) {
		this.descriptionImage = descriptionImage;
	}
 
	public Set<ImageGalerie> getImageGaleries() {
		return this.imageGaleries;
	}
 
	public void setImageGaleries(Set<ImageGalerie> imageGaleries) {
		this.imageGaleries = imageGaleries;
	}
 
	public Set<ImageTheme> getImageThemes() {
		return this.imageThemes;
	}
 
	public void setImageThemes(Set<ImageTheme> imageThemes) {
		this.imageThemes = imageThemes;
	}
 
}
Theme.java
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
 
package com.dawns.studio.javabeans;
 
// Generated 9 d�c. 2009 13:22:15 by Hibernate Tools 3.2.4.GA
 
import java.util.HashSet;
import java.util.Set;
 
/**
 * Theme generated by hbm2java
 */
public class Theme implements java.io.Serializable {
 
	/**
         * 
         */
	private static final long serialVersionUID = 1L;
	private Integer idTheme;
	private String libelleTheme;
	private Set<Galerie> galeries = new HashSet<Galerie>(0);
	private Set<ImageTheme> imageThemes = new HashSet<ImageTheme>(0);
 
	public Theme() {
	}
 
	public Theme(String libelleTheme) {
		this.libelleTheme = libelleTheme;
	}
 
	public Theme(String libelleTheme, Set<Galerie> galeries, Set<ImageTheme> imageThemes) {
		this.libelleTheme = libelleTheme;
		this.galeries = galeries;
		this.imageThemes = imageThemes;
	}
 
	public Integer getIdTheme() {
		return this.idTheme;
	}
 
	public void setIdTheme(Integer idTheme) {
		this.idTheme = idTheme;
	}
 
	public String getLibelleTheme() {
		return this.libelleTheme;
	}
 
	public void setLibelleTheme(String libelleTheme) {
		this.libelleTheme = libelleTheme;
	}
 
	public Set<Galerie> getGaleries() {
		return this.galeries;
	}
 
	public void setGaleries(Set<Galerie> galeries) {
		this.galeries = galeries;
	}
 
	public Set<ImageTheme> getImageThemes() {
		return this.imageThemes;
	}
 
	public void setImageThemes(Set<ImageTheme> imageThemes) {
		this.imageThemes = imageThemes;
	}
 
}
ImageTheme.java
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
 
package com.dawns.studio.javabeans;
 
// Generated 9 d�c. 2009 13:22:15 by Hibernate Tools 3.2.4.GA
 
/**
 * ImageTheme generated by hbm2java
 */
public class ImageTheme implements java.io.Serializable {
 
	/**
         * 
         */
	private static final long serialVersionUID = 1L;
	private ImageThemeId id;
	private boolean isPrincipale;
 
	public ImageTheme() {
	}
 
	public ImageTheme(ImageThemeId id, boolean isPrincipale) {
		this.id = id;
		this.isPrincipale = isPrincipale;
	}
 
	public ImageThemeId getId() {
		return this.id;
	}
 
	public void setId(ImageThemeId id) {
		this.id = id;
	}
 
	public boolean isIsPrincipale() {
		return this.isPrincipale;
	}
 
	public void setIsPrincipale(boolean isPrincipale) {
		this.isPrincipale = isPrincipale;
	}
 
}
ImageThemeId.java
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
 
package com.dawns.studio.javabeans;
 
// Generated 9 d�c. 2009 13:22:15 by Hibernate Tools 3.2.4.GA
 
/**
 * ImageThemeId generated by hbm2java
 */
public class ImageThemeId implements java.io.Serializable {
 
	/**
         * 
         */
	private static final long serialVersionUID = 1L;
	private Image image;
	private Theme theme;
 
	public ImageThemeId() {
	}
 
	public ImageThemeId(Image image, Theme theme) {
		this.image = image;
		this.theme = theme;
	}
 
	public Image getImage() {
		return this.image;
	}
 
	public void setImage(Image image) {
		this.image = image;
	}
 
	public Theme getTheme() {
		return this.theme;
	}
 
	public void setTheme(Theme theme) {
		this.theme = theme;
	}
 
	public boolean equals(Object other) {
		if ((this == other))
			return true;
		if ((other == null))
			return false;
		if (!(other instanceof ImageThemeId))
			return false;
		ImageThemeId castOther = (ImageThemeId) other;
 
		return ((this.getImage() == castOther.getImage()) || (this.getImage() != null
				&& castOther.getImage() != null && this.getImage().equals(
				castOther.getImage())))
				&& ((this.getTheme() == castOther.getTheme()) || (this
						.getTheme() != null
						&& castOther.getTheme() != null && this.getTheme()
						.equals(castOther.getTheme())));
	}
 
	public int hashCode() {
		int result = 17;
 
		result = 37 * result
				+ (getImage() == null ? 0 : this.getImage().hashCode());
		result = 37 * result
				+ (getTheme() == null ? 0 : this.getTheme().hashCode());
		return result;
	}
 
}

Et pour finir, voici ma classe de test:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
 
package com.tests;
 
import java.util.HashSet;
 
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
 
import com.dawns.studio.javabeans.Image;
import com.dawns.studio.javabeans.ImageTheme;
import com.dawns.studio.javabeans.ImageThemeId;
import com.dawns.studio.javabeans.Orientation;
import com.dawns.studio.javabeans.Theme;
import com.dawns.studio.service.ThemeService;
 
 
public class Test {
 
	public static void main(String[] args) {
		ApplicationContext ctx = new FileSystemXmlApplicationContext("D:\\workspace\\StudioPhoto\\WEB-INF\\src\\applicationContext.xml");
 
		Theme t  = new Theme();
		t.setLibelleTheme("Test3");
 
		Image i = new Image();
		i.setNomImage("Test3");
		i.setCheminImage("Test3");
		i.setOrientation(new Orientation("Paysage"));
 
		ImageThemeId imgThId = new ImageThemeId();
		imgThId.setImage(i);
		imgThId.setTheme(t);
		ImageTheme imgTh = new ImageTheme();
		imgTh.setIsPrincipale(true);
		imgTh.setId(imgThId);
 
		HashSet<ImageTheme> hash = new HashSet<ImageTheme>();
		hash.add(imgTh);
		t.setImageThemes(hash);
 
		ThemeService manager = ((ThemeService) ctx.getBean("themeService1"));
 
		manager.saveTheme(t);
	}
 
}
En laissant le tout tel quel, mon theme est persisté, mais la table de relation et l'image ne sont pas créés. J'ai essayé d'ajouter un cascade="all" sur le set lié à la table de relation au niveau du fichier de mapping de la table theme et dans ce cas, j'obtiens une exception accompagnée associée à un message persist failed.

Merci de votre aide.