我正在编写一个程序来对数十万个相关类型的实体运行批处理。我最初是通过每个持久化的单个事务来执行此操作的。这看起来很慢,所以我尝试按照http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html中描述的方式进行一些幼稚的批量更新,交易时间更长,偶尔刷新+清除。我的某些实体类型遇到了 ConstraintViolationException,因为我有唯一的字段约束。但是,我不确定如何检查现有实例;我目前有一个列出冲突的标准,但它似乎没有返回我在同一事务中保存或更新的实体。
一个虚构的例子可能会有所帮助:
实体 Family、Person、Name
Family 有很多 Person(一对多) Person
有很多名字,不同的 Person 可以有相同的 Name。(多对多)
我的更新包括保留一个家庭及其人员和名称,但我不确定如何对名称进行重复数据删除(可能与数据库中的现有名称或同一更新批次中的另一个名称冲突)。我可以在休眠之外跟踪新实体的唯一约束字段,但我认为这可能没有必要。是否有任何内置方法可以检查数据库中的重复项和未提交的更改?我看到Hibernate 使用 constraintviolationexception 进行批量更新,但我不喜欢在正常代码路径中使用异常。谢谢,我很感激任何指导。