java - hibernate 映射 : referencing a set of Entities with OneToMany and one Entity of that set with OneToOne

标签 java hibernate

我正在尝试实现一个 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/

相关文章:

java - 将 HashMap 放入 HashMap 中,然后填充这两个映射。

java - 相同的随机保证

hibernate - 当我添加 OneToMany 注释时,EntityManager 无法使用 JPA/Hibernate 进行实例化

java - 如何使用 JPA 和 Hibernate 使用映射为 ORDINAL 的枚举参数进行查询

java - hibernate 非法尝试将集合与两个打开的 session 相关联

java - GSON:如何在保持循环引用的同时防止 StackOverflowError?

java - 如何在 JPanel 中放置带有 jmathplot 图的 JFrame

java - 列表中的第一项图像错误

mysql - 如何将多行作为单个对象传递

spring - 是什么导致 Hibernate 选择上出现此 NullPointerException?