Java Hibernate Spring一域多域驱动设计

Java Hibernate Spring一域多域驱动设计,java,hibernate,domain-driven-design,Java,Hibernate,Domain Driven Design,我有两个实体“用户”和“组”。实际上,这是一个多个关联,但我希望在关系表中保留其他信息,如created或userid 所以我发现我必须引入一个新的实体来表示关系表“UserGroup” 各表: 用户id、名称、密码 组id、名称 usergroupid,userid,groupid,created,createduserid 实体: @Entity @Table(name="user") public class User { @OneToMany(mappedBy="user") L

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

所以我发现我必须引入一个新的实体来表示关系表“UserGroup”

各表:

用户id、名称、密码

id、名称

usergroupid,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;

  // ...
}
@实体
@表(name=“user”)
公共类用户{
@OneToMany(mappedBy=“用户”)
列出小组;
}
@实体
@表(name=“group”)
公共课组{
@OneToMany(mappedBy=“集团”)
列出用户名单;
}
@实体
@表(name=“usergroup”)
公共类用户组{
@许多酮
用户;
@许多酮
用户组;
@列(name=“created”)
创建日期;
// ...
}
现在由于领域驱动的设计,我不得不介绍 在我的用户实体方法中,比如:User::addGroup(group)、User::removeFromGroup(group)。 但从技术上来说,这似乎是不可能的,因为我需要创造 一个用户组实体,注入用户和组对象并最终持久化 请与EntityManager联系

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


(我可以在实体中使用ManyToMany来实现这一点。)

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

此外,您还需要在代码中使用通用语言中的术语,例如,将“UserGroup”替换为“Membership”

您不应该从另一个
聚合根(
用户
)引用一个
聚合根(
)。即使是临时引用,我也不会这样做,因为它会将不必要的知识转移给引用者,使其了解被引用的内容。因此,您的代码应该如下所示
User::addGroupMembership(groupId)
,并在内部创建
Membership
新实例

是否有更优雅的解决方案,或者我真的必须这样做 服务对象中实体之外的操作


如果您将此关联从一个域设置为一项服务,您将拥有一个。

让我向您指出沃恩·弗农(Vaughn Vernon)在设计用户和组之间的这种关系时的一个极好的例子:


如前所述,如果使用表之间的关系对对象进行建模,那么就错了。请参阅沃恩在其示例中使用的概念,以了解他如何建模用户属于某个组的事实。

正如康斯坦丁所指出的,这里您既不解释域,也不拆分聚合根。在考虑“表”之前,您需要很好地理解您正在建模的领域。无论如何,只要制作一个嵌入式集合,其中包含使用“userId、groupId created、useridCreated”构建的实体(用ORM术语),就可以实现您的要求。请看这里:,我建议您给出一个更直接的答案,指出用户可以查看实际示例的文件和方法。您的示例只是显示了将近40个java文件的列表,这有点令人沮丧,而且可能很耗时。