我有一個父對象與對象提交一對多關係的複合提交。我建立了如下關係:Eclipselink OneToMany合併刪除關係
@Entity
public class Compound implements Serializable {
@Id
private long compoundId;
...
@OneToMany(mappedBy="compound", fetch=FetchType.LAZY,
cascade={ CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.REMOVE })
@PrivateOwned
private List<Submission> submissions;
...
}
@Entity
public class Submission implements Serializable {
@Id
private long submissionId;
...
@ManyToOne(fetch=FetchType.LAZY,
cascade={ CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.REMOVE })
@JoinColumn(name="compoundId")
private Compound compound;
...
}
我已經設置了一個窗體(在Flex中)來修改所選化合物。給定表單輸出(一個名爲ObjectProxy的BlazeDS類,它擴展了HashMap),我將表單中的值映射到一個新的Compound對象上。提交數據未存儲在表單中,因此新複合對象上的提交列表保留爲空。
public Compound decodeWebForm(final ObjectProxy proxy) {
// create a new compound object
final Compound c = new Compound();
// map the proxy values onto the new compound
c.setCompoundId(proxy.get("compoundId"));
...
return updateCompound(c);
}
接下來我將已構建的複合對象合併到持久性上下文中。
public Compound updateCompound(final Compound c) {
// retrieve the entity manager
final EntityManager em = getEntityManager();
// begin a transaction
em.getTransaction().begin();
// merge changes to the managed compound
final Compound managed = em.merge(c);
// commit changes to the database
em.getTransaction().commit();
return managed;
}
我已經明確省略了關係定義中的CascadeType.MERGE指令。因此,當我調用EntityManager.merge(Compound)方法時,我期待沒有提交數據被忽略。但是,情況並非如此,任何有關正在修改的化合物I的提交都將被刪除。
我一定在做錯事或誤解了CascadeType.MERGE的含義?有人可以幫忙嗎?
感謝 詹姆斯
嗨克里斯。感謝您的回答。我認爲你是對的,我誤解了CascadeType.MERGE指出的行爲 - 這決定了每個被引用的提交中的變化是否被合併,而不是被合併的特定化合物引用的提交列表是否被合併。謝謝你的建議。 – 2012-03-26 11:54:12