Problème de cascade avec Hibernate
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:
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:
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:
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:
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:
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:
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:
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:
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:
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.