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,我可以在实体中执行此操作。)
您从“实体表”和“表之间的关系”开始了域描述,但这绝不是DDD方法。您必须向我们说明您的域,并忽略持久性,就好像所有对象都存储在内存中一样。
另外,您需要在代码中使用来自您普遍存在的语言的术语,例如,将“ UserGroup”替换为“ Membership”。
你不应该引用aggregate root(Group从另一个)aggregate root(User)。即使是临时参考,我也不会这样做,因为它将不必要的知识移交给参考者。您只能按ID进行引用。因此,您的代码应如下所示,User::addGroupMembership(groupId)并在内部创建的new实例Membership。
是否有更优雅的解决方案,还是我真的必须在服务对象中的实体之外执行此操作?
如果您通过域将这种关联作为服务,则将具有贫乏的域模型。
| 归档时间: |
|
| 查看次数: |
340 次 |
| 最近记录: |