2017-07-25 13 views
1

我一直在使用標準MVC體系結構(如域層)設計spring rest apis作爲POJO和存儲庫以從數據庫表中獲取域數據。到目前爲止,這些實體是隔離的,所以設計對每個實體都起着單獨的RestController,Service和Repository流程的作用。 我一直在尋求理解關於域對象即ORM中的關聯的最佳實踐。例如,讓我們下面的僞代碼來說明領域類(只爲宗旨,以表達有問題的設計,我還沒有提供完整的類):爲ORM域圖設計JPARepository的最佳實踐

public class Customer { 
    @Column 
    private int id; 

    @Column; 
    private String name; 

    @OneToMany 
    private List<Order> orders; 

    //...getters setters 
} 

public class Order { 
    @Column 
    private int id; 

    @Column; 
    private String orderNumber; 

    @OneToMany 
    private List<Product> products; 

    @ManyToOne 
    private Customer customer; 

    //...getters setters 
} 

public class Product { 
    @Column 
    private int id; 

    @Column; 
    private String productName; 

    @ManyToOne 
    private Order order; 

    //...getters setters 
} 

的困境,我從設計的角度都有。我有以下的方法是很清楚所有是不正確的:

  1. 定義一個RestController爲客戶提供所有的API資源,如/客戶/用戶/ ID /訂單/客戶/ ID /命令/ ID /產品等等。有一個服務負責處理這些域。爲每個域都有單獨的JPARepository。這裏的「保持簡單」的事情是,我爲每個域分隔存儲庫,所以我只需在相應的存儲庫類中提供查詢方法,以便查找特定域的詳細信息,即獲取給定客戶ID的訂單。但是,這讓我想到了使用ORM模型的目的,因爲我通過它們的Repository類獲取單個域。這個選項將使服務類中的所有3個存儲庫類都有線,而且我認爲這不是一個好的設計。 3可能在這裏看起來不錯,但是在我的實際需求中,我在ORM圖中有6到7個域,所以這意味着在一個服務類中自動裝配6個存儲庫。

  2. 一個RestController和一個Service類與上面的選項類似,但是Repository類也是單一的。存儲庫僅爲客戶域創建。通過這種方式,我可以檢索帶有其他domaim懶惰加載的客戶。這是爲了滿足「/ customers」的GET請求。要完成「/ customers/id/orders」的GET請求,我將再次使用Customer Repository,爲給定Id檢索客戶,然後返回Orders列表。此外,對於「/ customers/id/orders/id/products」的GET請求,我需要在Customer域中編寫一個手動數據提取機制,以便它負責檢索給定customerId和orderId的產品列表。這樣我使用一個存儲庫,滿足使用ORM的目的,但在客戶域中添加手動獲取數據方法。我看到的另一個負面情況是,即使我有customerId和orderId可用,我也需要獲取客戶域中的完整訂單列表。我會根據customerId提取一個訂單,而orderId是我爲訂單使用了一個單獨的存儲庫。

  3. 兩者都不正確,並且存在更好的方法。

我已經通過spring docs尋找倉庫和休眠文件的ORM。我通過多個教程來了解spring數據的一對多映射,但是我在不同的教程中找到了混合的方法。

這個問題看起來會重複給你,因爲我已經閱讀了關於這個設計問題的多個帖子在stackoverflow上,但沒有一個答案給了我上面提到的權衡和選項的推理。因此,我正在重新發布這個問題。

回答

0

這是一種混合的方法。例如在您的情況下,產品實體不需要與訂單具有@ManyToOne關係。想象一下,如果你的產品是100萬份訂單的一部分!您將查詢產品多少次以查找訂單?您將查詢findOrdersByProduct(產品),而不是findProductByOrder(訂單)

  1. 認爲w.r.t您的用例。有時候,如果您不會從關係所有者那裏獲取其他信息,則有一個定向映射是合理的

  2. 想想如果查詢實體,您將獲取的數據量(包括連接數)。

  3. e.g如果我取組織做我需要獲取所有員工?你的系統會拋棄(延遲加載會節省你大部分時間,但如果你有一個Angular,那麼它將綁定並獲取整個模型)。但與僱員實體的組織有多對一的關係確實有意義。