2011-07-24 79 views
1

我一直在使用Hibernate來存儲一個@JoinColumn使用@OneToMany一段時間的父子關係,它工作得很好。大塊數據存儲:休眠@OneToMany關係

但現在我已經達到了一個點,其中的對象的總大小太大,以適應內存。 (例如現在有300萬兒童記錄)。記錄全部存儲在一個文件中,然後在休眠之前先解析成Java對象。

我想「大塊」或「批量」記錄,以便我只需要將其中一小部分一次讀入內存。我的方法就像「加載10,000個子對象的集合,堅持數據庫(在父對象上調用'update'),清空子集合以釋放RAM,重複」。

我想這就像工作:

Iteration 1: Chunk1 (records 1-10,000) stored 
Iteration 2: Chunk2 (records 10,001-20,000) stored 
Iteration 3: Chunk3 (records 20,001-30,000) stored 
etc 

這裏就是我在遇到麻煩。我保存的集合隨每次迭代而改變,這會導致休眠在保存新的子節點之前刪除所有的舊的子節點。我沒有把所有的塊都保存起來,而是用

Iteration 1: Chunk1 stored 
Iteration 2: Chunk1 objects deleted, Chunk 2 stored 
Iteration 3: Chunk2 objects deleted, Chunk 3 stored 
etc 

所以最後只保存了我的最後一個塊。

有什麼方法可以改變這種行爲嗎?我已經閱讀了關於JDBC批處理的內容,但這不是我想要的。我也嘗試單獨存儲每個孩子,而不是通過「更新」到父母,但是當我這樣做時,孩子記錄被持久化而沒有指向父母的指針。

更新:

感謝您的快速和出色的響應。這種關係不是雙向的 - 我會盡力讓它變成這樣。我有遺留的代碼,不會與模式更改合作,所以我有點受到限制。

謝謝

回答

2

這裏的主要問題是:您的關係是雙向的嗎?也就是說,你有孩子方面的@ManyToOne指向父母嗎?

如果你這樣做,這種關係需要由孩子方面所擁有:

// in Parent 
@OneToMany(mappedBy="parent") 
List<Child> getChildren(); 

// in Child 
@ManyToOne 
Parent getParent(); 

當設置了這種方式,你做需要加載所有(或任何與此有關的)兒童在你父母的收藏中 - 你可以加載(或創建)子女,在他們的最後設置父母並保存;你當然可以批量做到這一點。

如果您的關係是而不是雙向然後根據您的問題它由父母擁有 - 那麼您需要使其雙向(如上所示)(或單向,但與其相反現在 - 見下文)。

在一個單獨的說明中,您是否還需要父母方面的@OneToMany?有300萬兒童記錄,我無法真正想象它在哪裏有用。

+0

謝謝!會試試這個。 – OneSolitaryNoob