为了账号安全,请及时绑定邮箱和手机立即绑定

使用 OneToMany 引用一组实体,并使用 OneToOne 引用该集合中的一个实体

使用 OneToMany 引用一组实体,并使用 OneToOne 引用该集合中的一个实体

30秒到达战场 2023-05-17 15:01:30
我正在尝试实现一个 Hibernate 关系,其中实体 A 通过引用一组实体@OneToManyB。这些实体之一B可能具有特殊作用,因此(可选)也应由Avia引用@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;}表group:id | groupSpokesman | ...该列引用了被选为发言人groupSpokesman的那个的 ID 。GroupMember如果 GroupMembers 中的一个是 Spokesman,则他应该保留在 GroupMembers 集合中。NULL如果没有选出发言人并且所有 GroupMembers 都受到平等对待,则该列可能是。表groupMember:id | groupId | ...该列groupId引用 所属的组的 ID GroupMember。Hibernate 成功保存实体。如果 GroupMembers 都不是发言人,则一切正常。但是一旦其中一个实体Group.members也被分配给,Hibernate 就会将该特定 GroupMember 的Group.spokesman外键设置为,这意味着发言人不再是该组的成员。外键已正确设置为发言人的 ID。GroupMember.groupNULLGroup.spokesman
查看完整描述

1 回答

?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

我最初的帖子中显示的映射似乎没问题。只有在一次保存实体 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);

不过,这对我来说似乎是一种解决方法。


查看完整回答
反对 回复 2023-05-17
  • 1 回答
  • 0 关注
  • 126 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信