簡體   English   中英

Hibernate JPA @OneToOne延遲加載

[英]Hibernate JPA @OneToOne Lazy loading

我正在嘗試將@OneToOne關聯設置為LAZY ,默認情況下為EAGER

我可以想到兩個原因:
1)將@OneToOne偽裝為@ManyToOne
2)在所有者表中具有外鍵列,然后將提取類型用作LAZY

任何人都可以指出上述策略的利弊。 另外,請告訴我是否還有其他更好的解決方案。

選項2是更正確,更干凈的解決方案-除非絕對必要,否則您不希望僅為了指示基礎ORM框架如何加載數據而修改模型。 但是,在某些情況下無法立即使用它,您必須調整JPA才能真正打開LAZY行為,或者使用選項1(但是,選項1應該使用@OneToMany而不是@ManyToOne )。

我將解釋並嘗試揭開選項2的神秘面紗-即。 @OneToOne@ManyToOne LAZY加載,它們將引用映射到單個實體(不是集合)。 例:

@Entity公共類Main {@OneToOne(fetch = FetchType.LAZY)私有次要中學; }

休眠如何進行延遲加載的方式是,它使用與Secondary類相同的方法創建一個代理對象,但只設置了@Id字段,而所有其他數據字段為空。 首次在此對象上調用任何方法時,數據都會加載到新的Secondary對象中,並且該方法調用將被轉發。 與EAGER加載的不同之處不僅在於以后僅在需要時才加載數據,而且即使在加載數據之后, Main實體和Secondary實體之間也始終會有一個中間對象。 如果可以創建Secondary的子類(如果不是最終的),則只能由JPA完成。

實現LAZY加載的另一種方法是修改原始的Secondary類,以將數據加載代碼注入每個方法中,從而無需代理。 實際上,代理對象的功能已合並到原始類的代碼中。 這稱為編織 (或字節碼檢測),可以在編譯期間甚至通過特殊的類加載器或附加的Java代理在運行時完成。 在比較執行效率時,適用以下不等式:代理比動態編織慢於靜態編織。 因此,揮舞是一種優化。 不過,在現實世界中,您很少會在意,因為增長速度微不足道。

通常,如果您通過@PersistenceContext注釋將EntityManager作為Java EE資源注入,則JPA會為您完成所有代理/編織,因此LAZY加載始終有效。 但是,如果手動創建EntityManager,例如Persistence.createEntityManagerFactory('unit').createEntityManager() ,則可能需要啟用編織。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM