Hibernate孤立删除 - 事务隔离级别

时间:2016-06-21 12:57:02

标签: java hibernate

我对hibernate有一个奇怪的问题。我的数据库关系如下:

Parent 
    @OneToMany(mappedBy = "parent", orphanRemoval = true)
    @Cascade({CascadeType.ALL})
    List<Child1> children1

Child1
    @ManyToOne
    @JoinColumn(name = "PARENT_ID")
    Parent parent;

    @OneToMany(mappedBy = "child1", orphanRemoval = true)
    @Cascade({CascadeType.ALL})
    List<Child2> children2;

Child2
    @ManyToOne
    @JoinColumn(name = "CHILD1_ID")
    Child1 child1;

children1children2列表的总长度为1。 我们有清除Parent.children1列表(从数据库中删除行)并将新子项添加到此列表(将新行插入数据库)的情况。不要问为什么我们要删除并插入新行而不是更新现有,让我们假设这是必要的。此方案如下所示:

  
      
  1. 清除Parent.children1列表
  2.   
  3. 新建Child2
  4.   
  5. 创建新Child1并将第2点(Child2)中创建的对象添加到children2列表
  6.   
  7. 将第4点(Child1)中创建的对象添加到children1列表
  8.   
  9. 保存Parent
  10.   

这是在一次交易中完成的。在此事务期间,我尝试在数据库中找到Parents(使用hibernate,在不同的事务中),我看到有时children2列表为空。怎么了?在将父项保存到数据库之前,我们总是将一个Child2对象添加到children2列表中,因此当children2列表为空时不应该出现这种情况。

1 个答案:

答案 0 :(得分:0)

请按以下步骤操作:

Parent parent = entityManager.find(Parent.class, id);
entityManager.lock(parent, LockModeType.WRITE);
parent.children1.clear();

并查看结果?