我遇到了这个问题,我已经解决了,但仍然无法解释它的原因。该问题与分离状态下的对象修改有关。
我有的:
人->(一二多)-> 地址。Person 有一个惰性地址列表(带有 orphanRemoval = true)。
什么问题:
当我清除处于分离状态的人员地址时,即使在将人员重新连接到新会话、更新和提交之后,旧地址仍然存在于数据库中。但是合并后的所有作品很有趣。
什么问题:
与update(person )相比,merge(person)有什么变化?
我所做的:
在第一个会话中:
person.setAddresses(addressesList);
transaction1.commit();
session1.close():
分离状态:
person.getAddresses().clear(); //addresses collection declares with orphanRemoval = true option. So all addresses should be deleted after collection is clear. Is it true in detached state?
在第二次会议中:
session2.update(person); //Person person2= (Person)session.merge(person); - solve the problem
person.getAddresses().add(newAdress);
transaction2.commit();
session2.close();
添加:
“如果您确定会话不包含具有相同标识符的已持久实例,请使用 update()。如果您想随时合并您的修改而不考虑会话的状态,请使用 merge()。换句话说, update() 通常是您在新会话中调用的第一个方法,确保分离实例的重新附加是执行的第一个操作。” (c) 来自文档。
但我的 session2 是新鲜的。在这种情况下,merge() 方法可能会改变吗?
源代码:
@Entity
@Table(name = "person")
public class Person{
@Id
@SequenceGenerator(name = "person_sequence", sequenceName = "sq_person")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "person_sequence")
@Column(name = "id")
private int id;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
@JoinColumn(name = "person_id")
private List<FileInfo> files;
//getter & setter
}
@Entity
@Table(name = "address")
@Inheritance(strategy= InheritanceType.JOINED)
public class Address {
@Id
@SequenceGenerator(name = "adress_sequence", sequenceName = "sq_adress")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "address_sequence")
@Column(name = "id")
private long adressID;
@JsonIgnore
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "person_id")
private Person person;
}