Bonsoir à tous !
Je découvre actuellement Hibernate et je rencontre un problème lors de la sauvegarde d'une relation many-to-many.
La relation many-to-many a lieu entre une table "Utilisateur" et une table "jeu". Voici le code de mes classes (généré via l'outils de génération de code d'Hibernate pour eclipse) :
Code:
package fr.exchangeit.model;
// Generated 30 déc. 2011 01:00:06 by Hibernate Tools 3.4.0.CR1
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import static javax.persistence.GenerationType.IDENTITY;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
/**
* Utilisateur generated by hbm2java
*/
@Entity
@Table(name="utilisateur", catalog="exchangeit")
@SuppressWarnings("serial")
public class Utilisateur implements java.io.Serializable {
private Integer id;
private String nom;
private String prenom;
private String login;
private String mdp;
private String email;
private String descriptif;
private Boolean admin;
private Set<Jeu> jeus = new HashSet<Jeu>(0);
private Set<Jeu> jeus_1 = new HashSet<Jeu>(0);
public Utilisateur() {
}
public Utilisateur(String nom, String prenom, String login, String mdp, String email, String descriptif, Boolean admin, Set<Jeu> jeus, Set<Jeu> jeus_1) {
this.nom = nom;
this.prenom = prenom;
this.login = login;
this.mdp = mdp;
this.email = email;
this.descriptif = descriptif;
this.admin = admin;
this.jeus = jeus;
this.jeus_1 = jeus_1;
}
@Id
@GeneratedValue(strategy=IDENTITY)
@Column(name="id", unique=true, nullable=false)
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(name="nom")
public String getNom() {
return this.nom;
}
public void setNom(String nom) {
this.nom = nom;
}
@Column(name="prenom")
public String getPrenom() {
return this.prenom;
}
public void setPrenom(String prenom) {
this.prenom = prenom;
}
@Column(name="login")
public String getLogin() {
return this.login;
}
public void setLogin(String login) {
this.login = login;
}
@Column(name="mdp")
public String getMdp() {
return this.mdp;
}
public void setMdp(String mdp) {
this.mdp = mdp;
}
@Column(name="email")
public String getEmail() {
return this.email;
}
public void setEmail(String email) {
this.email = email;
}
@Column(name="descriptif", length=65535)
public String getDescriptif() {
return this.descriptif;
}
public void setDescriptif(String descriptif) {
this.descriptif = descriptif;
}
@Column(name="admin")
public Boolean getAdmin() {
return this.admin;
}
public void setAdmin(Boolean admin) {
this.admin = admin;
}
@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(name="jeua", catalog="exchangeit", joinColumns = {
@JoinColumn(name="utilisateura", nullable=false, updatable=false) }, inverseJoinColumns = {
@JoinColumn(name="jeua", nullable=false, updatable=false)
})
public Set<Jeu> getJeus() {
return this.jeus;
}
public void setJeus(Set<Jeu> jeus) {
this.jeus = jeus;
}
@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(name="jeuveut", catalog="exchangeit", joinColumns = {
@JoinColumn(name="utilisateurveut", nullable=false, updatable=false) }, inverseJoinColumns = {
@JoinColumn(name="jeuveut", nullable=false, updatable=false)
})
public Set<Jeu> getJeus_1() {
return this.jeus_1;
}
public void setJeus_1(Set<Jeu> jeus_1) {
this.jeus_1 = jeus_1;
}
}
Code:
package fr.exchangeit.model;
// Generated 30 déc. 2011 01:00:06 by Hibernate Tools 3.4.0.CR1
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import static javax.persistence.GenerationType.IDENTITY;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
/**
* Jeu generated by hbm2java
*/
@Entity
@Table(name="jeu", catalog="exchangeit")
@SuppressWarnings("serial")
public class Jeu implements java.io.Serializable {
private Integer id;
private Console console;
private Type type;
private Studio studio;
private String nom;
private Integer annee;
private String descriptif;
private Boolean coeur;
private String img;
private Set<Utilisateur> utilisateurs = new HashSet<Utilisateur>(0);
private Set<Utilisateur> utilisateurs_1 = new HashSet<Utilisateur>(0);
public Jeu() {
}
public Jeu(Console console, Type type, Studio studio) {
this.console = console;
this.type = type;
this.studio = studio;
}
public Jeu(Console console, Type type, Studio studio, String nom, Integer annee, String descriptif, Boolean coeur, String img, Set<Utilisateur> utilisateurs, Set<Utilisateur> utilisateurs_1) {
this.console = console;
this.type = type;
this.studio = studio;
this.nom = nom;
this.annee = annee;
this.descriptif = descriptif;
this.coeur = coeur;
this.img = img;
this.utilisateurs = utilisateurs;
this.utilisateurs_1 = utilisateurs_1;
}
@Id
@GeneratedValue(strategy=IDENTITY)
@Column(name="id", unique=true, nullable=false)
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="console", nullable=false)
public Console getConsole() {
return this.console;
}
public void setConsole(Console console) {
this.console = console;
}
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="type", nullable=false)
public Type getType() {
return this.type;
}
public void setType(Type type) {
this.type = type;
}
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="studio", nullable=false)
public Studio getStudio() {
return this.studio;
}
public void setStudio(Studio studio) {
this.studio = studio;
}
@Column(name="nom")
public String getNom() {
return this.nom;
}
public void setNom(String nom) {
this.nom = nom;
}
@Column(name="annee")
public Integer getAnnee() {
return this.annee;
}
public void setAnnee(Integer annee) {
this.annee = annee;
}
@Column(name="descriptif", length=65535)
public String getDescriptif() {
return this.descriptif;
}
public void setDescriptif(String descriptif) {
this.descriptif = descriptif;
}
@Column(name="coeur")
public Boolean getCoeur() {
return this.coeur;
}
public void setCoeur(Boolean coeur) {
this.coeur = coeur;
}
@Column(name="img")
public String getImg() {
return this.img;
}
public void setImg(String img) {
this.img = img;
}
@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(name="jeua", catalog="exchangeit", joinColumns = {
@JoinColumn(name="jeua", nullable=false, updatable=false) }, inverseJoinColumns = {
@JoinColumn(name="utilisateura", nullable=false, updatable=false) })
public Set<Utilisateur> getUtilisateurs() {
return this.utilisateurs;
}
public void setUtilisateurs(Set<Utilisateur> utilisateurs) {
this.utilisateurs = utilisateurs;
}
@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(name="jeuveut", catalog="exchangeit", joinColumns = {
@JoinColumn(name="jeuveut", nullable=false, updatable=false) }, inverseJoinColumns = {
@JoinColumn(name="utilisateurveut", nullable=false, updatable=false) })
public Set<Utilisateur> getUtilisateurs_1() {
return this.utilisateurs_1;
}
public void setUtilisateurs_1(Set<Utilisateur> utilisateurs_1) {
this.utilisateurs_1 = utilisateurs_1;
}
@Override
public String toString() {
return this.id + ". " + this.nom;
}
}
Quand j'ajoute par exemple un jeu à un utilisateur et que je tente de sauvegarder (via la methode saveOrUpdate), j'ai l'erreur suivante :
Quote:
Grave: "Servlet.service()" pour la servlet ExchangeItController a généré une exception
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '3-1' for key 'PRIMARY'
J'ai donc l'impression qu'au lieu de simplement ajouter dans la base la nouvelle entrée du HashSet "jeus" de l'utilisateur, hibernate tente de sauvegarder de nouveau toutes les entrées du HashSet, ce qui par conséquent cause des erreurs de clefs primaires.
Je suppose que je procède mal ! Comment faire ?
Merci d'avance pour votre aide !