Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate孤立删除-事务隔离级别_Java_Hibernate - Fatal编程技术网

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

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

我对hibernate有个奇怪的问题。我的DB关系看起来像:

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
    列表中
  • 将在第4点(
    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一致。看起来这是一个随机问题,为了重现它,应该出现一些“事务边界”问题。如果您不能始终如一地重现场景,并且提供了解决方案,您如何知道它是否正常工作?