2010-04-08 80 views
2

我還有點猶豫,這是處理em.remove(entity)的最佳實踐,這個實體位於JPA中使用mappedBy映射的多個集合中。移除有關mappedBy集合的實體的最佳實踐?

考慮像Property引用其他三個實體的實體:一個Descriptor,一個BusinessObjectLevel實體。在Property實體中使用@ManyToOne並在其他三個對象中使用@OneToMany(mappedBy...)來定義映射。該反映射被定義是因爲在某些情況下我需要訪問這些集合。

每當我使用em.remove(prop)刪除一個屬性時,該元素不會自動從其他三種類型的管理實體中刪除。如果我不關心這一點,並且下面的頁面加載(webapp)沒有重新加載這些實體,那麼該屬性仍然存在,並且可能會做出一些不再是真實的決定。

逆映射可能會變得相當大,雖然我不想使用類似descriptor.getProperties().remove(prop)之類的東西,因爲它會加載所有那些可能在此之前已被延遲加載的屬性。

所以我目前首選的方法是刷新實體,如果它被管理:if (em.contains(descriptor)) em.refresh(descriptor) - 它卸載一個可能加載的集合並在下一次訪問時觸發重新加載。

是否有另一種可行的方法來處理已加載實體的所有mappedBy集合?

回答

1

你是檢查一個實體是否管理聽起來很棒的解決方案。

爲什麼不將它編程在實體的@PreRemove和@PrePersist上?這樣,您只需編程一次,並保持模型始終保持一致(沒有任何手動集合被篡改)。

的其他解決方案是更新的並插入後總是重定向,這迫使你控制器來查詢,而不是使用僞造的模型對象JPA。

更新: 您可能還需要檢查: JPA implementation patterns

+0

感謝您的想法。因爲我的模型至今沒有引用一個EntityManager本身和Seam上下文是用來使用的持久性事件,對我來說可能有點棘手 - 刷新方式可能不會以這種方式工作。和附加()/刪除()對關聯集合將是大集合過於昂貴。 – 2010-04-09 06:55:06

+0

我已經接受了解決方案,因爲它批准我的當前實現更多或更少。持久性事件的想法在某些情況下非常好用。 – 2010-04-19 07:18:05