【发布时间】:2012-03-23 14:43:15
【问题描述】:
我有一个与对象提交具有一对多关系的父对象 Compound。我已经建立了如下关系:
@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 对象上。提交数据未存储在表单中,因此新 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) 方法时,我期望忽略提交数据的缺失。但是,情况并非如此,任何与我正在修改的化合物相关的提交都将被删除。
我一定是做错了什么或者误解了 CascadeType.MERGE 的含义?有人可以帮忙吗?
谢谢 詹姆斯
【问题讨论】:
标签: jpa merge eclipselink cascade