我有一個簡單的Java應用程序,它將記錄插入到表「A」中,將它們鏈接到另一個表中的記錄,「B」通過讀取適當的「B」記錄,在「A」中設置引用並保存「一個記錄。我遇到的問題是,Hibernate顯然會在鏈接過程中讀取每個「B」記錄,最終導致程序運行內存不足(堆空間錯誤)。讓Hibernate在使用它們時釋放實體實例?
我看着JHAT的堆轉儲,這裏是有問題的類。前三個都是Hibernate的東西,第四個是我的Hibernate/JPA管理實體類。因爲它試圖實例GeoEntity的另一個實例時出現內存不足的錯誤,我的「B」表單位:
134489 instances of class org.hibernate.engine.spi.EntityKey
67245 instances of class org.hibernate.engine.spi.EntityEntry
67245 instances of class org.hibernate.internal.util.collections.IdentityMap$IdentityKey
67244 instances of class com.electricgearbox.model.GeoEntity
我已經通過我的代碼走了,我敢肯定,我沒有做任何事情像設置參考,然後從不清除它們。事實上,我明確地設置了我在循環結束時使用的兩個局部引用null。
那麼,有沒有人遇到過這個?我確定這是缺少的代碼行或我忘記的設置,但Google和Google閱讀Hibernate文檔沒有提供明顯的解決方案。如果沒有明顯的原因,Hibernate會保留這些引用嗎?
這是問題可用。我用EntityManager.flush()混淆了EntityManager.clear()。 – user1071914