2012-03-23 120 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