Hibernate:分离对象修改

时间:2013-08-05 07:10:39

标签: hibernate persistence

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

我有什么:

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

0 个答案:

没有答案