2009-11-03 42 views
25

比方說,我有一張200列的表格,其中大部分都不會被使用。2同一張桌子上的JPA實體

我將SmallEntity映射到經常使用的10列。我在與其他實體的關聯中使用它。它加載速度快,消耗少量內存並且讓我開心。

但有時我需要顯示200列。我想在200列上映射BigEntity類。它不存在其他實體,它沒有任何關聯。

問題:你有什麼經驗嗎?你是否知道Hibernate會遇到什麼麻煩,比如在第一級緩存中,一般的髒檢查和實體生命週期?

+1

好問題。遷移到新框架可能是此類問題的另一個原因。例如。可以有遺留系統和新系統,都應該對同一個數據庫工作。 – TomR 2014-06-08 14:08:24

回答

17

的最直接的方式做,這是屬性映射你不經常使用的lazy

<property name="extendedProperty" lazy="true" /> 

... or using Annotations ... 

@Basic(fetch = FetchType.LAZY) 
String getExtendedProperty() { ... } 

休眠初期不會加載這樣的性能;相反,它們會按需加載(第一次訪問時)。您可以通過在HQL查詢中使用fetch all properties子句來強制Hibernate加載所有屬性。

另一種可能的情況是實際上將兩個完全分開的實體映射到同一個表,但使其中一個爲immutable。請記住,它們作爲Hibernate的不同實體對待,其中第一/第二級緩存對於兩者都是完全獨立的(這就是爲什麼不變性很重要)。

你會能夠實現通過繼承映射此功能,因爲Hibernate 總是返回一個實際的具體實體類型。請看我對Hibernate Inheritance Strategy問題的回答以獲得詳細解釋。

+0

非常感謝你這個偉大的答案! – 2009-11-04 10:26:10

+0

看來,懶惰的屬性獲取需要字節碼檢測。這在項目中很常見嗎? 這是來自休眠註釋指南: 要啓用屬性級別的延遲獲取,您的類必須進行檢測:將字節碼添加到原始字符以啓用此功能,請參閱Hibernate參考文檔。如果你的類沒有插裝,屬性級別的延遲加載會被忽略。 2009-11-06 10:44:15

+0

是的,字節碼檢測對於懶惰屬性是必需的,但在構建期間很容易添加(http://docs.jboss.org/hibernate/stable/core/reference/en/html/performance.html#performance-fetching-lazyproperties )。這不是很常見(根據我的經驗),因爲懶惰屬性的用例(而不是懶惰關聯)並不常見,但它也不是非常罕見。如果這是您的擔憂,那麼以前肯定已經完成並且已經準備好了。 – ChssPly76 2009-11-06 17:18:57

相關問題