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 : 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
<?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 : 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
<?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 : 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
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 : 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
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
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, 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 : Sélectionner tout - Visualiser dans une fenêtre à part
Caused by: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session:
Je suis un peu paumé parceque je ne comprends pas pourquoi je ne peux pas ajouter de nouvel utilisateur dans un groupe 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 !