gpt4 book ai didi

java - Hibernate Spring OneToMany - ManyToOne 领域驱动设计

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:02:54 25 4
gpt4 key购买 nike

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

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

表格:

用户 id, name, pw

id, name

用户组 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;

// ...
}

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

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

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

最佳答案

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

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

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

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 - Hibernate Spring OneToMany - ManyToOne 领域驱动设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45952019/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com