2013-06-10 5 views
0

J'ai une question. J'utiliser JPA avec EclipseLink et je relation:JPA Cascade supprimer les orphelins

Table A ---< Table AB >---- Table B 

class A {  
@OneToMany(mappedBy = "a") 
private List<AB> abList  
} 

class AB {  
@ManyToOne(fetch = FetchType.LAZY) 
private A a;  
@ManyToOne(fetch = FetchType.LAZY) 
private B b;  
} 

class B {  
@OneToMany(mappedBy = "b") 
private List<AB> abList; 
} 

Il est relation ManyToMany entre A et B avec table de jointure AB. Maintenant, je veux retirer un enregistrement de la table A et supprimer en cascade les enregistrements de la table AB (table de jointure) et de la table B aussi.

Mais à partir de B seulement ceux qui ne sont connectés à aucun autre enregistrement de la table A (many-to-many relation entre A et B).

Comment régler CascadeType ou orphanremoval pour le faire correctement?

Répondre

0

Je suppose que vous travaillez avec Hibernate vous devriez faire un orphanRoval = true,

après essayer ceci: supposant que nous nécéssaire pour supprimer un (quelle classe A), nous faisons:

for (AB ab : a.getAbList()) { 
    B b = ab.get(); 
    if (b.getAbList().size()==1) { 
     em.remove(b); 
    } 
    em.remove(ab); 
} 
em.remove(a); 

Hope this aide

+0

Merci pour votre réponse. En fait je ne travaille pas avec hibernate mais avec eclipseLink. Si vous faites trois em.remove vous n'avez pas besoin d'orphelinRemoval ... – majkers

2

Si vous voulez supprimer AB et B lorsque A est supprimée, vient de mettre en cascade supprimer, (et orphanRemoval = true si vous voulez des cas supprimés à supprimer). Si la relation de A à B est vraiment ManyToMany, c'est-à-dire que B peut avoir plusieurs références, vous ne pouvez pas mettre en cascade la suppression de B (mais peut toujours passer en AB, assurez-vous de maintenir des relations bidirectionnelles dans votre modèle) .

Il n'y a aucun moyen de supprimer B s'il n'y a aucune relation avec celui-ci. Ce serait quelque chose comme le garbage collection, qui n'existe pas dans les bases de données relationnelles. Vous devez gérer cela à partir de votre application. Si B est quelque chose que vous voulez supprimer avec A, alors pensez à ne pas le partager, mais demandez à chaque A d'avoir sa propre instance B privée.