我正在嘗試實現一個 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);
不過,這對我來說似乎是一種解決方法。
添加回答
舉報
0/150
提交
取消