我遇到了问题,我已经解决了,但仍然无法解释它的原因。与分离状态下的对象修改相关联的问题。
我有什么:
人 - > (一对多) - >地址。 Person有一个懒惰的地址列表(与orphanRemoval = true )。
问题:
当我以分离状态清除人的地址时,即使将人重新接入新会话后,旧地址仍然存在于数据库中,更新并且承诺。但是,在合并所有作品后 。
问题:
合并(人)与更新(人)相比有什么变化?
我做了什么:
在第一个会话中:
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)来自documentation。
但我的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;
}