0

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

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

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

有一个唯一的Contentstr(如上所示),应用程序使用它来识别数据库中已经存在的内容 - 如果是这样,请重新使用该实体而不是再次添加它。

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

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

在这种情况下,查询工作正常,但似乎在创建内容对象但未提交时,查询没有检测到它们。

目前要解决这个问题,我实际上Map<String, Content>会仔细检查查询是否返回NULL

4

1 回答 1

0

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

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

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

于 2013-07-17T14:38:04.597 回答