Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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,我有一个应用程序,可以将数据导入到多个结构中 @Table(name="content") class Content { @Column(.., unqiue=true) String str; } @Table(name="group") class Group { @JoinTable("group_content"..) List<Content> contentList; }

我有一个应用程序,可以将数据导入到多个结构中

    @Table(name="content")
    class Content {
      @Column(.., unqiue=true)
      String str;
    }

    @Table(name="group")
    class Group {
      @JoinTable("group_content"..)
      List<Content> contentList;
    } 
@Table(name=“content”)
课堂内容{
@列(..,unqiue=true)
字符串str;
}
@表(name=“group”)
班级{
@可接合(“组内容”。)
列表内容列表;
} 
Content
有一个唯一的列
str
(如上所示),应用程序使用该列来识别数据库中已经存在的内容,如果存在,则重新使用该实体,而不是再次添加它

这是通过
ContentDao
实现中的
findByStr(stringstr)
方法完成的。它被实现为
命名查询
来自contentc,其中c.str=:str

当我运行导入时,其中组和内容都是新的,并且某些组引用相同(新)的内容,我的
findByStr
查询似乎返回
NULL

在这种情况下,查询可以正常工作,但当内容对象已创建但未提交时,查询似乎不会检测到它们


目前为了解决这个问题,我实际上保留了一个
映射
,以仔细检查查询是否返回
NULL

Hibernate不立即执行所有insert语句。确保在每次调用
findByStr
之前,所有新对象的所有SQL插入都发送到DB。您可以通过执行以下操作来确保:

  • 告诉休眠以考虑所有新对象。例如,您可以通过为每个新的组对象执行
    session.save(group)
    (将考虑相关的内容对象)来完成此操作
  • 执行一次session.flush()

通常,在这些更改之后,同一事务中的所有查询都必须可用。

为什么要手动实现关键行为?请查看文档中的正确术语:我不确定您的意思是什么部分可以自动完成?您能分享用于添加内容的代码吗?没有代码,很难说什么是错的。然后我想知道如果一个
与相同的
内容关联两次(并且在同一次运行中添加这些内容),会发生什么情况?ManyToMany实际上是一个使用
OrderColumn
列表,因此它是完全合法的-很抱歉在原始问题中没有提到这一点。您可以用现有代码替换
会话。保存(组)
。我的意思是有一个地方,你告诉冬眠考虑到这些新的对象。重用现有代码,然后调用flush.Yupp,我想我理解你的意思。但这仍然会导致一个问题,该组实际上包含两个具有相同
str
字段的新
Content
对象。在这种情况下,我需要做的是在每个
Content
对象上保存(),而不是允许从
Group.contentList()
进行级联。我认为这需要对Hibernate接受的代码进行一些更改(因为它目前为我保存了内容)。