Hibernate Spring OneToMany-ManyToOne域驱动设计

use*_*997 3 java domain-driven-design hibernate

我有2个实体“用户”和“组”。实际上,这是一个ManyToMany关联,但是我想在关系表中保留其他信息,例如created或userid。

因此,我发现必须引入一个新实体来表示关系表“ UserGroup”。

表格:

用户名,名称,密码

群组 ID,名称

用户组 ID,用户ID, ID,创建的,创建的用户 ID

实体:

@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;

  // ...
}
Run Code Online (Sandbox Code Playgroud)

现在由于域驱动设计,我不得不在我的用户实体方法中引入诸如:User :: addGroup(group),User :: removeFromGroup(group)。但是从技术上讲这似乎是不可能的,因为我需要创建一个UserGroup实体,注入User和Group对象,最后将其与EntityManager持久化。

是否有更优雅的解决方案,还是我真的必须在服务对象中的实体之外执行此操作?

(有了ManyToMany,我可以在实体中执行此操作。)

Con*_*enu 5

您从“实体表”和“表之间的关系”开始了域描述,但这绝不是DDD方法。您必须向我们说明您的域,并忽略持久性,就好像所有对象都存储在内存中一样。

另外,您需要在代码中使用来自您普遍存在的语言的术语,例如,将“ UserGroup”替换为“ Membership”。

你不应该引用aggregate rootGroup从另一个)aggregate rootUser)。即使是临时参考,我也不会这样做,因为它将不必要的知识移交给参考者。您只能按ID进行引用。因此,您的代码应如下所示,User::addGroupMembership(groupId)并在内部创建的new实例Membership

是否有更优雅的解决方案,还是我真的必须在服务对象中的实体之外执行此操作?

如果您通过域将这种关联作为服务,则将具有贫乏的域模型