我一直在使用標準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
}
的困境,我從設計的角度都有。我有以下的方法是很清楚所有是不正確的:
定義一個RestController爲客戶提供所有的API資源,如/客戶/用戶/ ID /訂單/客戶/ ID /命令/ ID /產品等等。有一個服務負責處理這些域。爲每個域都有單獨的JPARepository。這裏的「保持簡單」的事情是,我爲每個域分隔存儲庫,所以我只需在相應的存儲庫類中提供查詢方法,以便查找特定域的詳細信息,即獲取給定客戶ID的訂單。但是,這讓我想到了使用ORM模型的目的,因爲我通過它們的Repository類獲取單個域。這個選項將使服務類中的所有3個存儲庫類都有線,而且我認爲這不是一個好的設計。 3可能在這裏看起來不錯,但是在我的實際需求中,我在ORM圖中有6到7個域,所以這意味着在一個服務類中自動裝配6個存儲庫。
一個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是我爲訂單使用了一個單獨的存儲庫。
兩者都不正確,並且存在更好的方法。
我已經通過spring docs尋找倉庫和休眠文件的ORM。我通過多個教程來了解spring數據的一對多映射,但是我在不同的教程中找到了混合的方法。
這個問題看起來會重複給你,因爲我已經閱讀了關於這個設計問題的多個帖子在stackoverflow上,但沒有一個答案給了我上面提到的權衡和選項的推理。因此,我正在重新發布這個問題。