gpt4 book ai didi

Hibernate 批量插入/更新约束违反异常

转载 作者:行者123 更新时间:2023-12-02 11:28:24 24 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

关于Hibernate 批量插入/更新约束违反异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11187359/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com