hibernate在保存子实体时显示奇怪和非直观的行为

uplii1fm  于 2021-08-20  发布在  Java
关注(0)|答案(0)|浏览(164)

野蝇21
hibernate 5.3.18.final(jpa提供程序)
我在冬眠时无意中发现了一种非常奇怪的、非直觉的行为。
音素

@Embeddable
public class PhoneId
{
    @Column(name = "PERSON_ID")
    private int personId;

    @Column(name = "PHONE_ID")
    private int phoneId;

    // Getters, setters...
}

电话

@Entity
public class Phone
{
    @EmbeddedId
    private PhoneId id;

    private String number;

    // Getters, setters...
}

@Entity
public class Person
{
    @Id
    private int id;

    @OneToMany(mappedBy = "person", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Phone> phones = new ArrayList<>();

    // Getters, setters...
}

现在,假设数据库中有这些电话与id为的人关联 1 :
个人识别码=1,电话识别码=1,电话号码=1
个人识别码=1,电话识别码=2,号码=phone2
我得到了一个人:

Person person = em.find(Person.class, 1);
person.getPhones().size() // 2

并且,在分离模式下使用它,我将两个电话ID分别更改为3和4。我还为此人添加了第三部id为5的手机。之后,我想使用以下更改更新数据库:

person.getPhones().size() // 3
Person newPerson = em.merge(person);

所以,问题是:
之后,我希望在数据库的phones表中看到以下记录:
个人识别码=1,电话识别码=3,电话号码=1
个人识别码=1,电话识别码=4,电话号码=2
个人识别码=1,电话识别码=5,电话号码=3
但是你知道我看到了什么吗?我确实看到了这一点:
个人识别码=1,电话识别码=1,电话号码=1
个人识别码=1,电话识别码=2,号码=phone2
个人识别码=1,电话识别码=3,电话号码=1
个人识别码=1,电话识别码=4,电话号码=2
个人识别码=1,电话识别码=5,电话号码=3
因此,当我保存对数据库的更改时,我的集合中只有3部手机,hibernate没有删除数据库中的手机(它们的ID不再在手机集合中),而是将具有新ID的手机添加到数据库中。这里发生了什么事?这个有什么用 orphanRemoval 属性,如果它不删除ID已不在phones集合中的孩子?
如果我在一个集合中只有3部手机,我希望数据库中也只有3部手机。很公平。为什么hibernate忽略数据库中已经存在的电话而不删除它们?毕竟,数据库中的手机与集合中的手机具有不同的ID。
在我看来,这完全是不直观的,也是错误的,但如果我遗漏了什么或做错了什么,我非常想知道。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题