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