2013-12-09 57 views
0

可以說有一個實體Student與一個實體主體有一對多的關係,這個主體被延遲加載。 @OneToMany註釋用於指定關係。我想了解hibernate的內部工作原理如何處理這個註釋。hibernate關係註釋(@OneToOne,@OneToMany等)如何工作

+0

[它被稱爲開源的原因你知道](https://github.com/hibernate/hibernate-orm):) – fvu

+1

它的開源,但我需要知道哪個類看。它是否有任何註釋處理器來處理這個問題?比方說,學生對象已填充,但科目不是由於延遲加載;當我打電話給student.getSubjects()實際發生了什麼。那就是我想知道的 –

+0

註解只是一個標記,真正的魔法是用「編織」又稱字節碼操作完成的 - 在加載時,類被有效地重寫以創建關係和延遲加載等事情。 – fvu

回答

1

當從數據庫中讀取的數據創建Student的一個實例時,Hibernate使用它自己的Collection實現(它調用PersistentCollection)來初始化subjects集合。

此PersistentCollection最初未初始化,並且不包含任何數據。第一次調用此集合的任何方法時,會執行SQL查詢以加載學生的所有主題,然後將主題緩存到集合中以進行所有後續方法調用。

+0

我還有一個問題。你能讓我知道hibernate在運行時如何知道集合需要被延遲加載嗎?它在編譯時操作字節碼還是運行時可用的註釋? –

+0

是的,註釋在運行時可用。當會話工廠創建時,Hibernate分析所有的實體類。 –

+0

感謝您的回覆 –