2012-04-12 128 views
20

從我的理解@OneToOne@ManyToOne JPA註釋做eager fetch。我希望這些在我的應用程序中被延遲加載,或者至少暗示它(這是hibernate默認的)。我已經開始添加註釋fetch = FetchType.LAZYJPA默認獲取類型

例如

@ManyToOne(optional = false, fetch = FetchType.LAZY) 

代替

@ManyToOne(optional = false) 

這是既麻煩又容易出錯。有沒有辦法在應用程序級別執行此操作?也許在persistence.xml中?

回答

19

到今天爲止,我已經選擇了具有休眠按照映射方面JPA規範通過註釋,只是因爲我還沒有收到使其配置的任何功能請求,這是令人吃驚的TBH。正如你指出的那樣,因爲Hibernate 3.0使用hbm.xml映射文件時,你想要的是默認設置。

允許通過配置不會違反規範作爲建議的另一個答案。

所以長話短說,沒有今天是不可能的。如果您希望看到該功能是可配置的,請創建功能請求。

3

沒有辦法。在JPA規範中沒有關於改變全局獲取策略的信息。 JPA提供1-1/N-1關聯EAGER提取,而1-N/M-N則提供LAZY。所有JPA實現都應遵循規範以符合規範。我認爲,應用程序開發人員最好不要在全球範圍內更改此默認值,因爲這幾乎是大多數情況下的最佳實踐,除非您只有一種類型的所有實體之間的關聯,如1-1。考慮一下,你可以在一個應用程序中將其設置爲「EAGER」,該應用程序包含一個真正豐富的實體模型,它具有複雜的關係和數據庫中數百萬的數據。手動覆蓋每個關聯的獲取策略可以讓開發人員對未來發生的事情負責。它不容易出錯,而是一個強大的功能。

+0

您使用一對一來證明這一點,但多對一是*遠遠*更常見的關聯類型。是的,在一對一關聯的情況下,提前獲取可能更好。懶惰作爲默認更好的原因更多的是這樣一個事實,即有很多定義明確的方法可以使運行時(在Hibernate和JPA中)都非常渴望,但幾乎沒有辦法明確地使它們懶。 – 2012-10-02 14:39:31

+0

在這種情況下,一對一和多對一是如何不同的,一個人如何證明另一個人沒有證明是正當的?我強烈認爲Erhan在這方面有一點意義。如果您有產品,但客戶希望將其與不同的JPA實施一起使用。然後,他們最終會出現不一致,或者他們將不得不修改原始代碼以使其與其他實現兼容。 然而,你完全正確地說在運行時不可能將關係變成懶惰。 – 2012-10-09 06:39:25

+0

因爲經驗表明一對一關係比多對一關係要頻繁得多,正如我已經指出的那樣。你是理想主義的;我很務實。我更喜歡現實世界的解決方案 – 2012-10-09 13:25:21

1

從我的理解@oneToOne和@ManyToOne JPA註釋做一個 渴望fectch。

JPA保證單值關係的急切加載(如果不是通過註釋或持久性XML聲明的話)。對於集合值關係,則默認爲延遲加載,但延遲加載(只)的提示,持久性提供支持JPA,所以你不能依賴它,並把檢查特定提供商(例如休眠,OpenJPA的)。請參閱this link作爲參考,並獲得更多見解。

6

JPA規範假定一般大多數應用都需要通過默認的單身關係渴望,而由默認值多關係偷懶。至少在我自己的經驗中,這通常是期望的架構。這是有道理的,因爲singleton關係在JPA層和DB層中不需要顯着的附加性能來創建外鍵上的單例連接。然而,矛盾的是,多值屬性創建或者N + 1個問題或大笛卡爾結果集是得到成倍膨脹爲集合元素的數量和連接抓取時使用人數的加入增加(儘管休眠專門無法處理連接獲取上2+熱切的關聯)。

話雖如此,至於你的建議,你需要一個具體的(說實話不是完全不尋常的)案件來處理。現在你有一個案例,但有數百個這樣的案例。所以要編寫規範,你需要在泛化和粒度之間畫一條線。

如果我是你的鞋子,如果你認爲這是一個絕對有用的功能要添加到JPA規範,我會提交給JCP。另一方面,如果你在特定的實現中得到這個(,那個和那個...),那麼你最終會得到所謂的供應商鎖定。因此,我會額外花費一小時在@ManyToOne @OneToOne屬性上設置懶惰獲取並保持供應商免費,因此如果說新的JPA實現出現的速度超過15倍,那麼Hibernate(或其他任何實現使用),那麼只需花費很少的努力即可將您的項目移至新的JPA實施。

+2

你完全錯誤地認爲「Hibernate特別無法處理2個渴望關聯中的聯結提取」。這完全是錯誤的。 – 2012-10-08 17:23:21

+0

你可能想谷歌「org.hibernate.loader.MultipleBagFetchException:不能同時取多個行李」 – 2012-10-09 06:17:57

+0

行李其實是一個特殊類型的集合沒有定義的JPA ... – 2012-10-09 13:06:08