编程语言
首页 > 编程语言> > java – Hibernate Spring OneToMany – ManyToOne域驱动设计

java – Hibernate Spring OneToMany – ManyToOne域驱动设计

作者:互联网

我有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;

  // ...
}

现在由于Domain Driven Design,我不得不介绍
在我的用户实体方法中,例如:User :: addGroup(group),User :: removeFromGroup(group).
但从技术上讲,这似乎是不可能的,因为我需要创造
一个UserGroup实体,注入User和Group对象并最终持久化
它与EntityManager.

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

(使用ManyToMany,我可以在实体中执行此操作.)

解决方法:

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

此外,您需要在代码中使用来自无处不在的语言的术语,例如将“UserGroup”替换为“Membership”.

您不应该从另一个聚合根(用户)引用聚合根(组).即使是临时引用,我也不会那样做,因为它会向引用者移动不必要的知识. You can only reference by ID.所以你的代码应该看起来像这个User :: addGroupMembership(groupId),并在内部创建一个新的Membership实例.

Is there a more elegant solution or do I really have to do this
operations outside of my entities in service objects?

如果您从域服务进行此关联,您将拥有anemic domain model.

标签:java,domain-driven-design,hibernate
来源: https://codeday.me/bug/20190828/1750651.html