Bonjour,
Je voudrais créer des groupes permettant de lier plusiers projets avec plusieurs utilisateurs.
On a donc :
- un Groupe possède 0..* Utilisateurs et 0..* Projets (même si 0 n'a pas bcp de sens)
- Un utilisateur peut appartenir à plusieurs groupes
- Un projet peut appartenir à plusieurs groupes
Pour cela j'ai créé 5 tables :
Group : id_Group, name_Group
User : id_User, name_User,...
Project : id_Project, name_Project,...
Group_User : id_Group, id_User (clé primaire composée)
Group_Project : id_Group, id_Project (clé primaire composée)
Et j'ai créé 3 classes (pas de classe pour la table de jointure, j'ai lu un peu partout que ce n'était pas nécessaire) et je les ai mappé comme suis avec des annotations. L'intérêt pour moi serait d'avoir au moins accès depuis le groupe aux utilisateurs et projets qui le composent, et depuis un utilisateur, aux groupes auxquels il appartient ( et donc aux projets accessibles):
Modèle Group : je map les projets et les utilisateurs
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
|
@Entity
@Table(name = "group_", catalog = "gds_db")
public class Group implements java.io.Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id_Group", unique = true, nullable = false)
private Integer idGroup;
@Column(name = "name_Group", nullable = false, length = 50)
private String nameGroup;
@ManyToMany
@JoinTable(name = "Group_User",
joinColumns = { @JoinColumn(name = "fk_id_Group")},
inverseJoinColumns={@JoinColumn(name="fk_id_User")})
private List<User> usersGroup;
@ManyToMany
@JoinTable(name = "Group_Project",
joinColumns = { @JoinColumn(name = "fk_id_Group")},
inverseJoinColumns={@JoinColumn(name="fk_id_Project")})
private List<Project> projectsGroup;
//...
} |
Modèle utilisateurs :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
@Entity
@Table(name = "user_", catalog = "gds_db")
public class User implements java.io.Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id_User", unique = true, nullable = false)
private Integer idUser;
@Column(name = "name_User", nullable = false, length = 50)
private String nameUser;
@ManyToMany
@JoinTable(name = "Group_User",
joinColumns = { @JoinColumn(name = "fk_id_User")},
inverseJoinColumns={@JoinColumn(name="fk_id_Group")})
private List<Group> groupsUser;
//...
} |
Modèle projet : même principe mais je ne map pas les groupes.
Donc je voudrais savoir si je suis sur la bonne voie ou complètement à côté de la plaque et s'il ya des erreurs dans mon mapping (Bien évidemment ça ne marche pas sinon il n'y a pas d'intéret).
Le problème est que lorsque que je veux lister tous les groupes (avec criteria), je ne récupère pas les projets et utilisateurs associés.
j'ai tenté plusieurs choses :
Tout d'abord un truc tous simple
1 2 3 4 5 6 7 8
|
@Transactional(readOnly = true)
public List<Group> findAll() {
Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
Criteria crit = session.createCriteria(Group.class);
List<Group> groups = crit.list();
return groups ;
} |
Et ensuite en essayant de créer des allias mùais je ne suis pas du tout sur de ce que je fais
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
|
@SuppressWarnings("unchecked")
@Transactional(readOnly = true)
public List<Group> findAll() {
Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
Criteria crit = session.createCriteria(Group.class);
crit.createAlias("User", "user");
crit.setProjection(Projections.projectionList()
.add(Property.forName("user.idUser"),"idUser")
.add(Property.forName("user.loginUser"),"loginUser")
.add(Property.forName("user.passwordUser"),"passwordUser")
.add(Property.forName("user.nameUser"),"nameUser")
.add(Property.forName("user.emailUser"),"emailUser")
.add(Property.forName("user.adminUser"),"adminUser")
.add(Property.forName("user.agentUser"),"agentUser")
.add(Property.forName("user.clientUser"),"clientUser")
.add(Property.forName("user.projectManagerUser"),"projectManagerUser"));
crit.setResultTransformer(Transformers.aliasToBean(User.class));
crit.createAlias("Project", "project");
crit.setProjection(Projections.projectionList()
.add(Property.forName("project.idProject"),"idProject")
.add(Property.forName("project.loginUser"),"nameProject")
.add(Property.forName("project.managerUserProject"),"managerUserProject"));
crit.setResultTransformer(Transformers.aliasToBean(Project.class));
List<Group> groups = crit.list();
return groups ;
} |
Bonne chance au courageux qui arrivera jusque là et merci de votre aide.
Partager