4

我遇到了这个问题,我已经解决了,但仍然无法解释它的原因。该问题与分离状态下的对象修改有关。

我有的:

人->(一二多)-> 地址。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;
}
4

0 回答 0