野蝇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。
在我看来,这完全是不直观的,也是错误的,但如果我遗漏了什么或做错了什么,我非常想知道。
暂无答案!
目前还没有任何答案,快来回答吧!