Java Hibernate孤立删除-事务隔离级别
我对hibernate有个奇怪的问题。我的DB关系看起来像:Java Hibernate孤立删除-事务隔离级别,java,hibernate,Java,Hibernate,我对hibernate有个奇怪的问题。我的DB关系看起来像: Parent @OneToMany(mappedBy = "parent", orphanRemoval = true) @Cascade({CascadeType.ALL}) List<Child1> children1 Child1 @ManyToOne @JoinColumn(name = "PARENT_ID") Parent parent; @OneT
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;
Parent
@OneToMany(mappedBy=“parent”,orphanRemoving=true)
@级联({CascadeType.ALL})
列出儿童1
孩子1
@许多酮
@JoinColumn(name=“PARENT\u ID”)
父母;
@OneToMany(mappedBy=“child1”,orphanRemoving=true)
@级联({CascadeType.ALL})
列出儿童2;
孩子2
@许多酮
@JoinColumn(name=“CHILD1\u ID”)
Child1 Child1;
children1
和children2
列表的大小始终为1。
我们有这样一个场景,当我们清除Parent.children1
list(从数据库中删除行)并将新的子级添加到此列表(向数据库插入新行)时。不要问我们为什么要删除并插入新行而不是更新现有行,让我们假设这是必要的。这个场景看起来像:
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;
Child2
Child1
,并将在第2点(Child2
)中创建的对象添加到children2
列表中Child1
)中创建的对象添加到children1
列表中这是在一个事务中完成的。在这个事务中,当我尝试在数据库中查找父对象时(使用hibernate,在不同的事务中),我发现有时候
children2
列表是空的。怎么了?在将父对象保存到数据库之前,我们总是将一个Child2
对象添加到children2
列表中,这样就不会出现children2
列表为空的情况。您是否可以应用以下步骤:
Parent parent = entityManager.find(Parent.class, id);
entityManager.lock(parent, LockModeType.WRITE);
parent.children1.clear();
看到结果了吗?请您执行以下步骤:
Parent parent = entityManager.find(Parent.class, id);
entityManager.lock(parent, LockModeType.WRITE);
parent.children1.clear();
看到结果了吗?你是通过
children2
访问List children2
还是通过Parent
访问List children2
通过children1
,但我通过Parent
访问children1
“我知道有时候children2列表是空的”—你能试着始终如一地重现这个问题吗。“有时”可能与应用程序代码或事务边界有关,而不是与hibernateNo一致。看起来这是一个随机问题和一些“交易边界”复制时可能会出现问题。如果您无法始终如一地复制场景,并且提供了解决方案,您如何知道它是否正常工作?您是通过Child1
访问List children2
还是通过Parent
访问List children2
通过children1
,但我通过Parent
访问Child1
“我发现有时children2列表是空的”——您能否尝试一致地重现此问题。“有时”可能与应用程序代码或事务边界有关,而不是与hibernateNo一致。看起来这是一个随机问题,为了重现它,应该出现一些“事务边界”问题。如果您不能始终如一地重现场景,并且提供了解决方案,您如何知道它是否正常工作?