2016-12-24 91 views
0

比方說,我有嵌套的對象是這樣的:Spring Data JPA:嵌套對象設計 - 單向?雙向?

 
Customer
Project
Rent
Fault
(and maybe deeper)

客戶包含了用戶的權利,我必須驗證。 再有就是更新故障的方法:

void updateFault(long faultId, String content, User user) { .. } 

問題:如何從故障到客戶?

  1. 選項:使用反向引用父:故障租,租到項目,項目以客戶
  2. 選項:使用反向引用從故障到客戶(以及從租到客戶等)
  3. 選項:沒有反向引用,並通過很多數據庫查詢走起來,如

    rent = rentRepository.findByFault(fault);

    project = projectRepository.findByRent(rent);

    customer = customerRepository.findByProject(project);

我讀到我應該避免雙向引用。但是如果我有20個關卡和大量數據呢?然後選項#3根本不適合。

我在Spring MVC項目中使用Spring Data JPA。

+0

選項1非常好。詳細瞭解雙向關係的好處。 http://in.relation.to/2016/09/28/performance-tuning-and-best-practices/ –

+1

你從更核心的通用概念映射到更具體的概念是什麼原因?通常你會完全相反。故障與租金,項目租賃,項目給客戶有關。通過這種方式,您可以使用更具體的存儲庫查詢來查找更多通用概念的項目(即使用FaultRepository.findByCustomer(...)使用手動聲明查詢)。 –

+0

@OliverGierke謝謝。我從來沒有聽說過我應該這樣做。這只是從OOP的角度來看(客戶有一個項目列表..)。你有沒有更深入的信息(教程)? 明天我會試試看。 – NoobieNoob

回答

1

一般有可能使用的情況下爲您的每個選項,我甚至想補充兩個:

  1. 沒有反向引用,並通過一個單一的走到一起

  2. 變化你的模型使得那些後面的引用成爲主要的參考。

讓我們來看看各種方法

  1. 反向引用的性質:這基本上意味着雙向映射。雖然原則上沒有錯,但很難讓它們正確,因爲基本上在使用java中的引用時,必須保持兩個方向同步,根據我的經驗,這很容易出錯。

  2. 直接反向引用:一旦你有了這些,我想這只是一個時間問題,直到你重新引用項目和租金爲止。此外,這也會在類之間創建循環依賴關係,否則這些依賴關係根本不直接相關一起這讓你(恕我直言)與糾結混亂。

  3. 級聯的數據庫查詢這隻會很慢。唯一可以做到這一點的情況是,當我有一個非常適合我所有其他需求的模型時,我只需要在非常稀疏的情況下使用此構造,而性能無關緊要。

  4. Direct Back back:與直接反向引用相比,它不會在java端創建依賴關係。你將不得不編寫自定義查詢,但thos應該是直截了當的。聽起來像是對我來說合理的解決方案。

  5. 回覆引用模型中的(我偷點從@Oliver基爾克這裏):根據您目前的建模方法,可以輕鬆地與具有關係,一切一個實體結束。如果你的域名不重要,這將變得混亂。如果你有1:N的關係,這往往意味着N方可以是零/空,所以它是真正的可選。你也經常只需要子集。像所有未完成的項目或所有落後於計劃的項目一樣。所以在很多情況下,在相反的方向建模參考是有意義的。如果您需要導航原始方向,請使用該存儲庫。