2012-03-23 60 views
0

我有一个父对象与对象提交一对多关系的复合提交。我建立了如下关系: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的含义?有人可以帮忙吗?

感谢 詹姆斯

回答

2

两个问题: 1)你打上@PrivateOwned的关系,这应该引起也被删除所有非关联的实体。
2)你正在合并一个空的集合。级联合并(或缺少)意味着合并将(或不会)级联到提交实体。虽然集合本身的状态被认为是化合物的一部分,因此需要在数据库中更新。再加上#1,这意味着提交内容将被删除。如果不是针对#1,数据库中将没有变化(因为提交拥有该关系并且没有改变),但是当读回化合物实体时,它将显示空集或空集,除非它被刷新。

创建实体的新实例是一个坏主意。相反,您可能需要阅读它,并且仅更改表单中所需的内容,然后在需要时将此实体合并到事务上下文中。

+0

嗨克里斯。感谢您的回答。我认为你是对的,我误解了CascadeType.MERGE指出的行为 - 这决定了每个被引用的提交中的变化是否被合并,而不是被合并的特定化合物引用的提交列表是否被合并。谢谢你的建议。 – 2012-03-26 11:54:12