我有一個JPA實體「請求」,它擁有一個答案列表(也是JPA實體)。下面是它是如何在Request.java定義:爲什麼JPA在所有者實體失去對它們的引用時不刪除擁有的實體?
@OneToMany(cascade= CascadeType.ALL, mappedBy="request")
private List<Answer> answerList;
而且在Answer.java:
@JoinColumn(name = "request", referencedColumnName="id")
@ManyToOne(optional = false)
private Request request;
在實施計劃的過程中,回答的請求的名單可能答案添加或刪除它,或者實際的List對象可能被替換。因此,我的問題是:當我將請求合併到數據庫時,使用在List中的Answer對象將保存在數據庫中 - 也就是說,請求不再持有引用的Answer對象(間接,通過列表)不會被刪除。
這不是我想要的行爲,好像我將請求合併到數據庫,然後再次獲取它,它的答案列表可能不一樣。我是否犯了一些編程錯誤?是否有註釋或設置可確保數據庫中的答案完全是請求列表中的答案?
解決方案是保持對原始Answers列表的引用,然後在合併請求之前使用EntityManager刪除每個舊的Answer,但似乎應該有一個更清晰的方法。
在Hibernate中,這可以通過使用CascadeType.DELETE_ORPHAN來完成。 – 2010-03-02 03:19:21