Hibernate查询未在同一事务中查找“挂起”实体

时间:2013-07-17 13:46:39

标签: java hibernate

我有一个用于将数据导入ManyToMany结构的应用程序。

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

    @Table(name="group")
    class Group {
      @JoinTable("group_content"..)
      List<Content> contentList;
    } 

Content有一个唯一的列str(如上所示),应用程序使用该列来标识数据库中已存在的内容 - 如果是,则重新使用该实体而不是添加它试。

这是通过findByStr(String str)实现中的ContentDao方法完成的。它是以NamedQueryfrom Content c where c.str = :str)实现的。

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

查询在此方案之外工作正常,但似乎在创建Content对象但未提交时,查询不会检测到它们。

目前要解决这个问题,我实际上要保留一个Map<String, Content>来检查查询是否返回NULL

1 个答案:

答案 0 :(得分:0)

Hibernate不会立即执行所有插入语句。确保在每次调用findByStr之前,将所有新对象的所有SQL插入内容发送到DB。您可以通过以下方式确保:

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

通常情况下,在同一事务中,您的查询必须具有所有更改。