Bonjour,
j'ai 2 tables livres et abonnes reliées entre elles par une relation n-n. J'ai donc une table emprunt qui joue le rôle de cette association. Cette table comprend la clé composite ainsi qu'une colonne annexe rajoutée.
Via JPA, je cherche à créer un emprunt et à le persister en cascade dans les tables abonnes et livres.
Dans mon entité Emprunt, j'ai donc ceci :
Code:
1
2
3
4
5
6
7
8 @ManyToOne(cascade=CascadeType.PERSIST) @JoinColumn(name = "abonne_id", updatable=false, insertable=false) private Abonne abonne; @ManyToOne(cascade=CascadeType.PERSIST) @JoinColumn(name = "livre_id", updatable=false, insertable=false) private Livre livre;
Dans mon entité emprunt, j'ai créé un constructeur prenant en params un abonne, un livre et ma colonne annexe (test).
Code:
1
2
3
4
5
6
7
8
9
10
11
12 public Emprunt(Abonne abonne, Livre livre, String test) { this.abonne = abonne; this.livre = livre; this.setTest(test); getId().setAbonneId(abonne.getId()); getId().setLivreId(livre.getId()); abonne.getEmprunts().add(this); livre.getEmprunts().add(this); }
je cherche donc à persister une seule fois pour les 3 tables en faisant ceci :
Code:
1
2
3
4
5
6
7
8
9
10 Abonne a = new Abonne(); a.setNom("test"); a.setPrenom("test"); Livre l = new Livre(); l.setLibelle("test"); Emprunt e = new Emprunt(a, l, "test"); em.persist(e);
J'obtiens une MySQLIntegrityConstraintViolationException. Cela est du je pense au fait que l'emprunt est inséré avant les livres et l'abonne en base. Ca correspondrait bien à l'exception mais je croyais que JPA devait pouvoir connaitre l'ordre d'insertions en base selon les annotations ? En tout cas dans une relation 1-n sans table d'association, lorsque j'essaie d'insérer les fils avant le père, JPA m'insérer bien le père avant...
Aucun problème si je procède ainsi, les valeurs sont insérées dans les 3 tables :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 Abonne a = new Abonne(); a.setNom("test"); a.setPrenom("test"); Livre l = new Livre(); l.setLibelle("test"); em.persist(a); em.persist(l); Emprunt e = new Emprunt(a, l, "test"); em.persist(e);
Est ce possible donc dans une relation n-n avec table d'association d'insérer dans les 3 tables avec un seul persist en jouant avec l'attribut cascade ?
Merci