我有一个用于将数据导入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
方法完成的。它是以NamedQuery
(from Content c where c.str = :str
)实现的。
当我运行导入时,其中组和内容都是新的,并且某些组请求相同(新)内容,我的findByStr
查询似乎返回NULL
。
查询在此方案之外工作正常,但似乎在创建Content对象但未提交时,查询不会检测到它们。
目前要解决这个问题,我实际上要保留一个Map<String, Content>
来检查查询是否返回NULL
。
答案 0 :(得分:0)
Hibernate不会立即执行所有插入语句。确保在每次调用findByStr
之前,将所有新对象的所有SQL插入内容发送到DB。您可以通过以下方式确保:
session.save(group)
来执行此操作(将考虑相关内容对象)session.flush()
通常情况下,在同一事务中,您的查询必须具有所有更改。