我有一个父对象与对象提交一对多关系的复合提交。我建立了如下关系: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