我正在尝试实现一个 Hibernate 关系,其中实体 A 通过 @OneToMany
引用一组实体 B。其中一个实体 B
可能具有特殊作用,因此(可选)也应该由 A
通过 @OneToOne
引用。
实体A:
public class Group {
@Id
@GeneratedValue
@Column(name = "id", updatable = false)
private int id;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "group")
private List<GroupMember> members = new ArrayList<>();
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "groupSpokesman")
private GroupMember spokesman;
}
实体B:
public class GroupMember {
@ManyToOne
@JoinColumn(name = "groupId")
private Group group;
}
表组
:
id | groupSpokesman | ...
groupSpokesman
列引用被选为发言人的 GroupMember
的 ID。如果其中一个群组成员是发言人,则他应该保留在群组成员集中。如果没有选举发言人并且所有组成员都受到平等对待,则该列可能为 NULL
。
表groupMember
:
id | groupId | ...
groupId
列引用 GroupMember
所属组的 ID。
Hibernate 成功保存实体。如果群组成员中没有一个是发言人,则一切正常。但是,一旦 Group.members
中的一个实体也被分配给 Group.spokesman
,Hibernate 就会设置外键 GroupMember.group
将该特定 GroupMember 更改为 NULL
,这意味着发言人不再是该组的成员。外键 Group.spokesman
已正确设置为发言人的 ID。
最佳答案
我最初的帖子中显示的映射似乎没问题。仅当实体 A 和所有映射实体 B 一次保存时才会出现该问题,例如
Group g = new Group();
GroupMember gm1 = new GroupMember();
GroupMember gm2 = new GroupMember();
g.addGroupMember(gm1); // gm1.group is null
g.addGroupMember(gm2);
g.setGroupSpokesman(gm1);
repository.save(g);
一旦我保存实体两次(第一次在设置组发言人之前;第二次之后),一切都会按预期进行:
Group g = new Group();
GroupMember gm1 = new GroupMember(); // gm1.group is set to ID of g
GroupMember gm2 = new GroupMember();
g.addGroupMember(gm1);
g.addGroupMember(gm2);
repository.save(g);
g.setGroupSpokesman(gm1);
repository.save(g);
不过,这对我来说似乎是一个解决方法。
关于java - hibernate 映射 : referencing a set of Entities with OneToMany and one Entity of that set with OneToOne,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57374182/