2012-04-09 53 views
0

我仍然不是一個對JPA感到完全舒適的階段。JPA - 何時使用關係?

現在我在使用關係註釋或只是在需要查詢時才檢索相關對象。

例如我有一個擁有項目的用戶。我可以使用onetomany關係並以對象時尚方式檢索項目,或者我可以在需要時簡單地查詢用戶的項目。

後一種解決方案涉及更多的代碼,但不管怎樣,我對我想要做的事情有更多的自由和控制權,或者至少這是我的印象。前者顯然會處理相當數量的鍋爐板代碼,例如創建/刪除/更新對象,但在此過程中學習的技巧有很多。

如果有人能夠提出一個簡單的經驗法則,以便在何時使用JPA中的關係註釋(最好基於她/他的經驗),我將不勝感激。

感謝,

托馬斯

+0

出於興趣,您爲什麼認爲在使用JPA或使用其他方法時需要更改模型?你的模型是你的模型。你設計它。然後你決定什麼位持續。 – DataNucleus 2012-04-09 10:19:05

+0

我不需要改變我的模型。然而,我給項目給出的例子,在後一種情況下會導致項目擁有一個變量來保存用戶的id,即owner = userid。然後,我會通過查詢所有者與用戶名相匹配的所有項目來檢索用戶的項目。 – Thomas 2012-04-09 13:29:59

回答

1

基本規則是,您應該在需要時創建關係。

對於一對一和多對一的關係,這很容易:你幾乎總是需要它們。例如,當您顯示Project信息時,您幾乎總是需要顯示其所有者信息,因此創建關係在此處是一個不錯的選擇。

一對多和多對多的關係需要更多的關注,因爲過度使用它們會導致性能問題。

我個人的經驗法則是:如果你不需要顯示所有Project S的User一次無分頁或過濾(或至少不需要經常這樣做),不創建一段關係。否則,您可以創建它(例如,您通常一次需要Order的所有OrderLine s,因此在這種情況下您需要一對多關係)。

0

當兩個實體之間的關係,你希望使用它,使用JPA關係的註解。其中一個主要優勢就是在實體之間存在關係時不必手動進行額外查詢。

0

我會去註釋。它更簡單,產生更少的代碼,這是使用JPA的關鍵點。此外,一對多集合默認情況下會被延遲獲取,因此您不會冒險從數據庫中提取不需要的東西。

但我建議閱讀懶惰/渴望提取和學習如何工作。

0

您的問題是有效的,在JPA兼容的ORM中,關係很難。然而,關係的好處是可以在JPA QL查詢中使用它們。例如。當你想獲取用戶使用相同的名字創建的所有項目,你可以寫:

@ManyToOne 
private User user 
Project關係

你有一個簡單:

SELECT p 
FROM Project p 
WHERE p.user.name = 'Smith' 

,而不是當你不能做到這一點

private int userId; 

還調查各種取材策略,以感覺更舒適的關係。

0

這一切都取決於您的應用程序如何檢索數據及其所需實例。儘管JPA可以在任何地方使用,即使在Java EE容器之外(這對於在標準Java SE應用程序中使用,或者與Spring等一起使用也是一個巨大的優勢),我發現它的「思維方式」非常重視Request - 響應式交互,映射到Web應用程序等(這些公平的是最近流行的企業服務器端應用程序類型)。但是,除非您有一些非常具體的需求,否則我肯定會投資學習JPA關係註釋。

在JPA中,一切都在EntityManager會話中進行。如果你有一個EntityManager實例在整個工作流程中管理你的實體,你提到你需要獲取用戶,項目等。,所有這一切都在一個請求 - 響應中,那麼肯定會使用@OneToMany等,因爲它將負責在需要的時候獲取子實體,而不關心如何加入外鍵,並在何時檢索什麼時進行優化。即使您需要在請求中攜帶相同的實體,但使用refresh()merge()時也很簡單。

我同意你說的註釋往往會變得有點毛毛與FetchType,CascadeType的等等,你可能還面臨着偶爾的臭名昭著的PersistenceException cannot simultaneously fetch multiple bags,所以它是一個顛簸,但一旦你得到了它的竅門,我認爲它值得投資。