Bonjour,
Merci d'avance pour votre aide éventuelle.
Je me suis mis récemment à JPA, et je ne trouve pas de solutions à l'heure actuelle au problème suivant.
J'insère un objet Groupe composé d'une liste d'objets Droits au sein d'une transaction JPA. Le soucis est sur l'objet Droits dont la clé primaire est composé de la clé primaire de Groupe et de celle d'un autre objet Module.
Lors du remplissage de la liste des droits, l'id de Groupe n'est pas encore connu, et lors de l'insertion des objets, la clé étrangère de Droits faisant référence à Groupe n'est pas actualisé.
Je vous mets le détail de mes classes
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 @Entity @Table(name="Droits") public class Droits implements java.io.Serializable { private static final long serialVersionUID = 4489581477725526437L; private DroitsId id; private Module Module; private Groupe Groupe; private int droitStatut; public Droits() { } public Droits(DroitsId id, Module Module, Groupe Groupe, short droitStatut) { this.id = id; this.Module = Module; this.Groupe = Groupe; this.droitStatut = droitStatut; } @EmbeddedId @AttributeOverrides( { @AttributeOverride(name="groupId", column=@Column(name="group_id", nullable=false) ), @AttributeOverride(name="modId", column=@Column(name="mod_id", nullable=false) ) } ) public DroitsId getId() { return this.id; } public void setId(DroitsId id) { this.id = id; } @ManyToOne(fetch=FetchType.LAZY, cascade = CascadeType.MERGE) @JoinColumn(name="mod_id", nullable=false, insertable=false, updatable=false) public Module getModule() { return this.Module; } public void setModule(Module Module) { this.Module = Module; } @ManyToOne(fetch=FetchType.LAZY, cascade = CascadeType.ALL) @JoinColumn(name="group_id",nullable=false, insertable=false, updatable=false) public Groupe getGroupe() { return this.Groupe; } public void setGroupe(Groupe Groupe) { this.Groupe = Groupe; }
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 @Embeddable public class DroitsId implements java.io.Serializable { private static final long serialVersionUID = 5377378130220718206L; private int groupId; private int modId; public DroitsId() { } public DroitsId(int groupId, int modId) { this.groupId = groupId; this.modId = modId; } @Column(name="group_id", nullable=false) public int getGroupId() { return this.groupId; } public void setGroupId(int groupId) { this.groupId = groupId; } @Column(name="mod_id", nullable=false) public int getModId() { return this.modId; } public void setModId(int modId) { this.modId = modId; }La propriété Groupe de [Droits] est bien mise à jour lors de l'insertion de Groupe, mais pas le groupId de DroitsId.
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 @Entity @Table(name="T_Sec_Groupe" , uniqueConstraints = @UniqueConstraint(columnNames="group_nom") ) public class Groupe implements java.io.Serializable { private static final long serialVersionUID = -4866064782151701760L; private int groupId; private String groupNom; private Set<Droits> Droitses = new HashSet<Droits>(0); private Set<Utilisateur> Utilisateurs = new HashSet<Utilisateur>(0); public Groupe() { } public Groupe(String groupNom) { this.groupNom = groupNom; } public Groupe(String groupNom, Set<Droits> Droitses) { this.groupNom = groupNom; this.Droitses = Droitses; } public Groupe(String groupNom, Set<Droits> Droitses, Set<Utilisateur> Utilisateurs) { this.groupNom = groupNom; this.Droitses = Droitses; this.Utilisateurs = Utilisateurs; } @Id @GeneratedValue @Column(name="group_id", unique=true, nullable=false) public int getGroupId() { return this.groupId; } public void setGroupId(int groupId) { this.groupId = groupId; } @Column(name="group_nom", unique=true, nullable=false, length=50) public String getGroupNom() { return this.groupNom; } public void setGroupNom(String groupNom) { this.groupNom = groupNom; } @OneToMany(fetch=FetchType.LAZY, mappedBy="Groupe", cascade=CascadeType.ALL) public Set<Droits> getDroitses() { return this.Droitses; } public void setDroitses(Set<Droits> Droitses) { this.Droitses = Droitses; }
Donc j'obtiens :
Si quelqu'un comprend ce que je souhaite et voit le soucis au niveau du mappage, pour pouvoir insérer un objet Groupe et une liste de Droits, sans avoir ce problème.INSERT est en conflit avec la contrainte FOREIGN KEY "T_Sec_Groupe_T_Sec_Droits". Le conflit s'est produit dans la base de données "", table "dbo.T_Sec_Groupe", column 'group_id'.
Merci.
Cordialement,
Antoine
Partager