休眠批处理插入/更新约束冲突异常



我正在编写一个程序,对数十万个相关类型的实体运行批处理。 我最初是用每个持久一个事务来做到这一点的。 这似乎很慢,所以我尝试按照 http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html 中描述的方式进行有点幼稚的批处理更新,使用更长的事务和偶尔的刷新+清除。 对于我的某些实体类型,我遇到了约束违规异常,因为我具有唯一的字段约束。 但是,我不确定如何检查现有实例;我目前有一个列出冲突的条件,但它似乎没有返回我在同一事务中保存或更新的实体。

一个虚构的例子可能会有所帮助:
实体 家庭、人物、姓名
家庭有很多人(一对多)
人有很多名字,不同的人可以有同样的名字。(多对多)

我的更新包括保留一个系列及其人员和名称,但我不确定如何对名称进行重复数据删除(可能会与数据库中的现有名称或同一更新批次中的另一个名称发生冲突)。 我可以在休眠之外跟踪新实体的独特约束字段,但我认为这可能没有必要。 是否有任何内置方法可以检查数据库中的重复项和未提交的更改? 我看到带有约束冲突异常的休眠批处理更新,但我不喜欢在正常代码路径中使用异常。 谢谢,我感谢任何指导。

简短回答:否。对于批处理操作,Hibernate不会跟踪生成的id,因此,您必须为每个Name访问数据库,因为您将根据名称而不是ID进行查询,除非您使用一些查询缓存(我想这对您的情况来说很棘手)。

我的建议是分两步(三步?)过程执行此操作:首先,批量插入所有Name对象。然后,使用Hibernate本身加载它们,并将它们存储在Map上。然后,只需持久化其他数据,将Name链接到非持久化Person。当然,你需要和名字一样多的内存:-) 但是,您为什么要将Name作为一个单独的实体呢?

最新更新