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 java : Sélectionner tout - Visualiser dans une fenêtre à part
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 java : Sélectionner tout - Visualiser dans une fenêtre à part
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 java : Sélectionner tout - Visualiser dans une fenêtre à part
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 java : Sélectionner tout - Visualiser dans une fenêtre à part
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