我对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;
children1
和children2
列表的总长度为1。
我们有清除Parent.children1
列表(从数据库中删除行)并将新子项添加到此列表(将新行插入数据库)的情况。不要问为什么我们要删除并插入新行而不是更新现有,让我们假设这是必要的。此方案如下所示:
- 清除
Parent.children1
列表- 新建
Child2
- 创建新
Child1
并将第2点(Child2
)中创建的对象添加到children2
列表- 将第4点(
Child1
)中创建的对象添加到children1
列表- 保存
醇>Parent
。
这是在一次交易中完成的。在此事务期间,我尝试在数据库中找到Parents(使用hibernate,在不同的事务中),我看到有时children2
列表为空。怎么了?在将父项保存到数据库之前,我们总是将一个Child2
对象添加到children2
列表中,因此当children2
列表为空时不应该出现这种情况。
答案 0 :(得分:0)
请按以下步骤操作:
Parent parent = entityManager.find(Parent.class, id);
entityManager.lock(parent, LockModeType.WRITE);
parent.children1.clear();
并查看结果?