簡體   English   中英

Hibernate Spring OneToMany - ManyToOne領域驅動設計

[英]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 rootUser )引用aggregate rootGroup )。 即使是臨時引用,我也不會那樣做,因為它會向引用者移動不必要的知識。 您只能通過ID引用 因此,您的代碼應該看起來像User::addGroupMembership(groupId)並在內部創建一個newMembership實例。

是否有更優雅的解決方案,還是我真的必須在服務對象的實體之外執行此操作?

如果您從域服務進行此關聯,您將擁有貧血域模型

讓我指出Vaughn Vernon在設計User和Group之間的這種關系時的優秀例子:

https://github.com/VaughnVernon/IDDD_Samples/tree/master/iddd_identityaccess/src/main/java/com/saasovation/identityaccess/domain/model/identity

如前所述,如果使用表之間的關系對對象進行建模,則表明您做錯了。 請參閱Vaughn在其示例中使用的概念,以了解他如何模擬用戶屬於某個組的事實。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM