4

我正在编写一个程序来对数十万个相关类型的实体运行批处理。我最初是通过每个持久化的单个事务来执行此操作的。这看起来很慢,所以我尝试按照http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html中描述的方式进行一些幼稚的批量更新,交易时间更长,偶尔刷新+清除。我的某些实体类型遇到了 ConstraintViolationException,因为我有唯一的字段约束。但是,我不确定如何检查现有实例;我目前有一个列出冲突的标准,但它似乎没有返回我在同一事务中保存或更新的实体。

一个虚构的例子可能会有所帮助:
实体 Family、Person、Name
Family 有很多 Person(一对多) Person
有很多名字,不同的 Person 可以有相同的 Name。(多对多)

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

4

1 回答 1

2

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

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

于 2012-06-25T10:29:28.693 回答