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 :
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
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>
J'ai mes deux classes Java suivantes :
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>
Groupe.java
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 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; } }
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
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; } }
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.
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()); }
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 :
Je suis un peu paumé parceque je ne comprends pas pourquoi je ne peux pas ajouter de nouvel utilisateur dans un groupe
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: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 !
Partager