[英]Attempting achieve low coupling between JPA entities
我遇到的一個問題是在不犧牲SOLID原則的情況下映射與JPA / Hibernate一對多關系的一種好方法。 這是我正在處理的當前項目中的此問題的示例:
給定以下代碼,該代碼定義了單向一對多關系:
@Entity
@Table(name = "users")
public class User extends AggregateEntity<User> implements HasRoles, HasContactInfo, HasContacts, HasDeals {
@OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.LAZY)
@JoinColumn(name = "fk_hasContacts")
private Set<Contact> contacts;}
我的理解是,這將在“聯系人”表中創建“ fk_hasContacts”列,而無需“ Contact”類知道或關心它是從哪個對象引用的。 另外,請注意“用戶”如何實現“ hasContacts”接口,該接口在兩個實體之間產生去耦效果。 如果明天我想再上一堂課; 說“ BusinessEntity”(也有聯系人),則在當前代碼中無需更改任何內容。 但是,在閱讀了該主題之后,從數據庫性能的角度來看,這種方法似乎效率很低。
映射@OneToMany關聯關系的最佳方法是依靠@ManyToOne端傳播所有實體狀態更改-如此處所述 。
似乎是普遍的智慧。 如果以這種方式進行設計,那么“ User”類現在將如下所示:
@Entity
@Table(name = "users")
public class User extends AggregateEntity<User> implements HasRoles, HasContactInfo, HasContacts, HasDeals {
@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
private Set<Contact> contacts;
並且(以前已分離)的“ Contact”類現在必須看起來像這樣:
@Entity
@Table(name = "contacts")
public class Contact extends StandardEntity<Contact> {
@ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinColumn(name = "fk_user")
private User user;
關鍵的問題是,從這里開始 ,JPA似乎不支持將接口定義為實體屬性。 所以這段代碼:
@Entity
@Table(name = "contacts")
public class Contact extends StandardEntity<Contact> {
@ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinColumn(name = "fk_user")
private HasContacts hasContacts;//some class which implements the "HasUser" interface
不是一個選擇。 似乎必須在SOLID OOP和有效的ORM實體之間進行選擇。 經過大量閱讀之后,我仍然不知道對數據庫性能的影響是否足夠嚴重,不足以證明編寫等同於緊密耦合,嚴格且最終不良代碼的內容是合理的。
設計原則中似乎存在矛盾的解決方法/解決方案嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.