我在這裏的問題與我的其他問題幾乎相似Explicit delete on JPA relationships 但我想進一步簡化它以保證更詳細的答案。爲什麼合併不是級聯在一對多關係上
想象一下,我有一個父母和孩子之間的OneToMany關係。
@Entity
public class Parent {
private String name;
@OneToMany(mappedBy="owner",cascade=CascadeType.ALL, fetch=FetchType.EAGER)
private List<Child> children;
}
@Entity
public class Child {
private String name;
@ManyToOne
private Parent owner;
}
在我的用戶界面中,我顯示了父級列表。用戶可以選擇一位家長,並且他/她可以編輯其子女的列表。 爲了表明這一點,我使用了一個currentParent變量來表示當前編輯的父級。 用戶可以選擇添加/編輯孩子的名字。
單擊按鈕後,我會使用EJB調用保存新的子項列表。
@ViewScoped
public class MyBean(){
private Parent currentParent;
@EJB
private MyEJB myEJB;
public void saveChanges(){
myEJB.save(currentParent);
}
}
我的EJB調用如下所示。
@Stateless
public class MyEJB{
@PersistenceContext(unitName = "MyPU")
private EntityManager em;
public void save(Parent parentNew){
Parent pOld = em.find(entityClass, p.getId());
if(pOld !=null){
pOld.setName(parentNew.getName());
pOld.setChildren(parentNew.getChildren());
em.merge(pOld);
}
}
}
我的問題是,我能夠更改父的名字,但對兒童列表中的任何改變不會反映到數據庫。 它不會更改或執行任何SQL來刪除/更新/添加子項。
可能是什麼原因?
UPDATE
經過一些試驗和錯誤嘛,讀通各個環節,似乎在我的@OneToMany設置orphanRemoval選項就可以解決我的問題。 Eclipselink會在合併期間自動刪除孤立行。
這麼多的JPA複雜..
@Entity
public class Parent {
private String name;
@OneToMany(mappedBy="owner",cascade=CascadeType.ALL, fetch=FetchType.EAGER,orphanRemoval = true)
private List<Child> children;
}
也許這將有助於:http://stackoverflow.com/questions/10656765/handling-collection-updates-with-jpa – JMelnik
嗨,我不知道如果我從那個鏈接得到的答案,所以你的意思是我有循環收集並逐一保存?我真的認爲eclipselink會處理我的收藏的保存?例如,我在一個實體中有5個孩子,然後我只用兩個孩子編輯它,當我調用合併操作時,它將負責刪除/添加行。謝謝 –