Hibernate批量插入/更新constraintviolationexception

我正在编写一个程序来运行几个相关类型的数十万个实体的批处理.我原来是这样做的,每次持续一个事务.这似乎非常慢,所以我尝试按照
http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html中描述的方式进行一些天真的批量更新,事务处理时间较长,偶尔会刷新清除.我正在为某些实体类型遇到ConstraintViolationException,因为我有唯一的字段约束.但是,我不确定如何检查现有实例;我目前有一个列出冲突的标准,但似乎没有返回我在同一个事务中保存了saveOpdated的实体.

一个简单的例子可能会有所帮助:
实体家庭,人,姓名
家庭有很多人(一对多)
人有很多名字,不同的人可以有相同的名字. (多对多)

我的更新包括持久化Family及其Persons和Names,但我不确定如何重复删除Names(可能与db中的现有Name或同一更新批次中的其他Name冲突).我可以跟踪hibernate之外的新实体的唯一约束字段,但我认为这可能不是必需的.在db和未提交的更改中是否有任何内置的检查重复项的方法?我看到了Hibernate batch updates with constraintviolationexception,但我不喜欢在正常的代码路径中使用异常.谢谢,我感谢任何指导.

最佳答案 简答:不.对于批处理操作,Hibernate不会跟踪生成的ID,因此,您必须为每个Name转到数据库,因为您要根据名称而不是ID进行查询,除非您是使用一些查询缓存(我认为这对你的情况很棘手).

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

点赞