2010-03-12 3 views
0

У меня есть класс объектов Foo foo, который содержит Collection<Bar> bars. Я пробовал разные способы, но я не смог успешно обновить свою коллекцию.Обновление проблемы с использованием JPA

одна попытка:

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

Это добавляет новую коллекцию к старому.

Еще одна попытка:

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

На данный момент, я думал, что я мог бы добавить новую коллекцию, но я считаю, что объект Foo был уничтожен.

Вот несколько аннотаций. В Foo:

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

В баре:

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

Кто-нибудь еще были проблемы с этим? Есть идеи?

ответ

2

Второй подход будет работать, если вы удалите CascadeType.ALL от private Foo foo и позвоните по телефону foo.getBars().clear() после удаления Bar s.

В настоящее время, когда вы удалите Bar с в вашем втором подходе, удаление распространяется на соответствующий Foo сущности, потому что CascadeType.ALL включает CascadeType.REMOVE.

+0

Когда я пытаюсь это, я получаю: 'javax.persistence.EntityNotFoundException: удаленный объект передается сохраняются: [com.Bar # ]' –

+0

@FarmBoy:. Вы также должны вызвать 'foo.getBars() ясно () 'после удаления' Bar'. – axtavt

+0

Теперь он работает, спасибо большое. –

Смежные вопросы