[英]Hibernate Spring OneToMany - ManyToOne Domain Driven Design
我有2個實體“用戶”和“組”。 實際上這是一個ManyToMany關聯,但我想在關系表中保留額外的信息,如created或userid。
所以我發現我必須引入一個代表關系表“UserGroup”的新實體。
表格:
用戶 ID,名稱,pw
組 ID,名稱
usergroup id,userid,groupid,created,createduserid
實體:
@Entity
@Table(name="user")
public class User {
@OneToMany(mappedBy="user")
List<UserGroup> groups;
}
@Entity
@Table(name="group")
public class Group {
@OneToMany(mappedBy="group")
List<UserGroup> users;
}
@Entity
@Table(name="usergroup")
public class UserGroup {
@ManyToOne
User user;
@ManyToOne
User group;
@Column(name="created")
Date created;
// ...
}
現在由於域驅動設計,我將不得不在我的用戶實體方法中引入如下:User :: addGroup(group),User :: removeFromGroup(group)。 但從技術上講,這似乎是不可能的,因為我需要創建一個UserGroup實體,注入User和Group對象,最后用EntityManager保存它。
是否有更優雅的解決方案,還是我真的必須在服務對象的實體之外執行此操作?
(使用ManyToMany,我可以在實體中執行此操作。)
您使用“實體表”和“表之間的關系”開始了您的域描述,這絕不是DDD方法。 您必須將您的域取之,並忽略持久性,就好像所有對象都存儲在內存中一樣。
此外,您需要在代碼中使用來自無處不在的語言的術語,例如將“UserGroup”替換為“Membership”。
您不應該從另一個aggregate root
( User
)引用aggregate root
( Group
)。 即使是臨時引用,我也不會那樣做,因為它會向引用者移動不必要的知識。 您只能通過ID引用 。 因此,您的代碼應該看起來像User::addGroupMembership(groupId)
並在內部創建一個new
的Membership
實例。
是否有更優雅的解決方案,還是我真的必須在服務對象的實體之外執行此操作?
如果您從域服務進行此關聯,您將擁有貧血域模型 。
讓我指出Vaughn Vernon在設計User和Group之間的這種關系時的優秀例子:
如前所述,如果使用表之間的關系對對象進行建模,則表明您做錯了。 請參閱Vaughn在其示例中使用的概念,以了解他如何模擬用戶屬於某個組的事實。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.