Hibernate批量插入/更新constraintviolationexception

时间:2012-06-25 10:15:14

标签: hibernate batch-processing

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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