Je possède deux tables Utilisateur et Groupe et j'ai une table d'association Utilisateur_Groupe.
Un utilisateur peut être dans plusieurs groupes et un groupe peut contenir plusieurs utilisateurs. J'ai donc fait deux many-to-many dans mes fichiers de mappings :
User.hbm.xml :
Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="User" table="UTILISATEUR">
<id name="idUser" column="id_user">
<generator class="native" />
</id>
<property name="login" column="LOGIN" />
<property name="password" column="PASSWORD" />
<property name="isActive" column="IS_ACTIVE" />
<property name="isAdmin" column="IS_ADMIN" />
<property name="email" column="EMAIL" />
<set name="groupes" table="UTILISATEUR_GROUPE">
<key column="ID_USER"/>
<many-to-many column="ID_GROUPE" class="Groupe"/>
</set>
</class>
</hibernate-mapping>
Groupe.hbm.xml :
Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="Groupe" table="GROUPE">
<id name="idGroupe" column="id_groupe">
<generator class="native" />
</id>
<property name="name" column="NAME" />
<set name="users" table="UTILISATEUR_GROUPE" inverse="true" lazy="false">
<key column="ID_GROUPE"/>
<many-to-many column="ID_USER" class="User"/>
</set>
</class>
</hibernate-mapping>
J'ai mes deux classes Java suivantes :
Groupe.java
Code:
public class Groupe implements Serializable {
private static final long serialVersionUID = 2672915341934914235L;
private Integer idGroupe;
private String name;
private Set<User> users = new HashSet<User>();
public Set<User> getUsers() {
return users;
}
public void setUsers(Set<User> users) {
this.users = users;
}
public void addUser(User user) {
this.users.add(user);
}
public Integer getIdGroupe() {
return idGroupe;
}
public void setIdGroupe(Integer idGroupe) {
this.idGroupe = idGroupe;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
User.java
Code:
public class User implements Serializable {
private static final long serialVersionUID = -5758827873119865415L;
private Integer idUser;
private String login;
private String password;
private Boolean isActive;
private Boolean isAdmin;
private String email;
private Set<Groupe> groupes;
public User() {}
public Set<Groupe> getGroupes() {
return groupes;
}
public void setGroupes(Set<Groupe> groupes) {
this.groupes = groupes;
}
public Integer getIdUser() {
return idUser;
}
public void setIdUser(Integer idUser) {
this.idUser = idUser;
}
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Boolean getIsActive() {
return isActive;
}
public void setIsActive(Boolean isActive) {
this.isActive = isActive;
}
public Boolean getIsAdmin() {
return isAdmin;
}
public void setIsAdmin(Boolean isAdmin) {
this.isAdmin = isAdmin;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
Dans ma classe DAO je fais ça :
Code:
public void addUserToGroupe(User user, Groupe groupe) {
Session session = sessionFactory.getCurrentSession();
Groupe groupeInBase = (Groupe)session.load(Groupe.class, groupe.getIdGroupe());
System.out.println("GroupeInBase : " + groupeInBase.getUsers().size());
groupeInBase.addUser(user);
session.save(groupeInBase);
System.out.println("GroupeInBase after : " + groupeInBase.getUsers().size());
}
A noter que j'utilise Hibernate 3.3.2 et Spring 2.5.5. Je fais mes tests en utilisant Junit 4 et j'ai un test qui ne passe pas, celui qui doit ajouter un utilisateur à un groupe. Je fais juste appel à la méthode de la DAO ci-dessus et compare les résultats de ma base avec ceux attendus.
Le problème c'est que je n'ai pas d'update/insertion de mon utilisateur via la méthode sus-cité. Hibernate ne fait que des select, aucun update.
J'ai essayé avec un cascade="save-update" dans mon fichier Groupe.hbm.xml mais je me prends une exception :
Code:
Caused by: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session:
De ce que j'avais compris c'était pourtant ce cascade qui permettait de mettre à jour la table d'association.
Pour résumer je ne comprends pas comment faire pour mettre à jour un set depuis un objet récupéré par hibernate :(
J'ai retourné le web pour voir ce que je rate mais je ne pige pas donc je m'en remets à vous !
Merci pour l'aide !