2010-05-20 57 views
4

我相信這是一種常見的情況。說我有在冬眠一對多映射:Category有很多Items什麼是一個多休眠的最佳做法


類別:

@OneToMany(
    cascade = {CascadeType.ALL},fetch = FetchType.LAZY) 
@JoinColumn(name="category_id") 
@Cascade(
    value = org.hibernate.annotations.CascadeType.DELETE_ORPHAN 
) 
private List<Item> items; 

項目:

@ManyToOne(targetEntity=Category.class,fetch=FetchType.EAGER) 
@JoinColumn(name="category_id",insertable=false,updatable=false) 
private Category category; 

一切工作正常。我用Category來完全控制Item的生命週期。但是,當我編寫代碼更新Category時,首先從數據庫中獲取Category。然後將其傳遞給UI。用戶填寫Category的更改值並傳回。問題出在這裏:因爲我只傳遞Category信息,而不是Items,因此Items集合將爲空。當我撥打saveOrUpdate時,它會清除所有關聯。

任何建議什麼是最好解決這個問題?我認爲Category控制Items的好處是可以輕鬆掌握Items的順序,而不是雙向直接混淆。

但是你想更新Category本身的情況呢?首先加載併合並?

+0

我可以想到兩種可能的方式: 1.先獲取類別,然後根據UI返回的對象設置更新它的值。然後堅持下去。 2.使用醜陋的HibernateTemplate.bulkUpdate這是純sql。 – Patrick 2010-05-20 04:33:31

+0

我錯了關於HibernateTemplate.bulkUpdate。它使用HQL。目前我正在這樣做。但我仍然願意聽到關於此主題的任何意見 – Patrick 2010-05-23 06:45:14

回答

1

對於你的問題,如果我們從高層看到沒有進入代碼,我看到這個問題不是與hibernate配置有關,而是與你如何處理實體有關。我建議你修改你以下面的方式處理你的實體的方式,

1)你沒有提到你如何在將它傳遞給UI之前獲取Category對象。因此,如果您使用get load方法簡單獲取類別對象,那麼您可以簡單地創建單獨的初始化方法,該方法可以通過簡單地調用getter方法加載項目集合。通過getter方法延遲加載的項目集合將被填充&然後您可以將它傳遞給UI。用戶只需修改類別,以便項目保持原樣。之後,您可以保存該實體,以便項目保持原樣。 2)如果你不想在傳遞給用戶界面之前加載項目集合,那麼你可以只讀取沒有加載項目集合的類別對象。將它傳遞給UI。一旦用戶修改,&將其傳回,然後不是直接保存它,而是建議您首先獲取該category_id的最新類別對象,通過調用getters獲取其項目,然後將UI返回類別中的更改值填充到此最新獲取的類別中。現在你可以保存這個合併對象,這樣你的物品收集是安全的。

+0

感謝您的答案。它太長了,我不記得上下文。但之後我學到了更多。從內存中可以看到實體一側的逆向屬性,然後解決這個問題。 – Patrick 2013-06-14 00:41:59

相關問題