2010-03-12 5 views
0

J'ai une classe d'entité Foo foo qui contient Collection<Bar> bars. J'ai essayé plusieurs méthodes, mais je n'arrive pas à mettre à jour ma collection avec succès.Problème lors de la mise à jour de la collecte à l'aide de JPA

Une tentative:

foo = em.find(key); 
foo.getBars().clear(); 
foo.setBars(bars); 
em.flush; \\ commit, etc. 

Cette nouvelle collection ajoute la à l'ancienne.

Une autre tentative:

foo = em.find(key); 
bars = foo.getBars(); 
for (Bar bar : bars) { 
    em.remove(bar); 
} 
em.flush; 

À ce stade, je pensais que je pourrais ajouter la nouvelle collection, mais je trouve que la foo entité a été effacé.

Voici quelques annotations. Dans Foo:

@OneToMany(cascade = { CascadeType.ALL }, mappedBy = "foo") 
private List<Bar> bars; 

In Bar:

@ManyToOne(optional = false, cascade = { CascadeType.ALL }) 
@JoinColumn(name = "FOO_ID") 
private Foo foo; 

Quelqu'un at-il eu du mal avec cela? Des idées?

Répondre

2

La deuxième approche fonctionnerait si vous supprimez CascadeType.ALL de private Foo foo et appelez foo.getBars().clear() après avoir supprimé Bar s.

Actuellement, lorsque vous supprimez Bar s dans votre deuxième approche, le retrait se propage à l'entité Foo correspondante, parce que CascadeType.ALL comprend CascadeType.REMOVE.

+0

Lorsque je tente, je reçois: 'javax.persistence.EntityNotFoundException: entité supprimée passé à persist: [com.Bar # ]' –

+0

@FarmBoy. Vous devriez appeler 'aussi foo.getBars() clair () 'après avoir enlevé' Bar's. – axtavt

+0

Cela fonctionne maintenant, merci beaucoup. –

Questions connexes