gpt4 book ai didi

java - Hibernate 监听器中的数据库访问

转载 作者:行者123 更新时间:2023-12-01 09:27:57 26 4
gpt4 key购买 nike

假设存在诸如 ThingThingItem 之类的具有 1:N 关系的实体。想象一下,有数百个项目,并且它们有一些重要且设置繁琐的属性。应该有一些 ThingBackup 收集对属于单个 Thing 的所有项目的所有更改(为了简单起见,它们被写成一个 blob)。

我正在使用hibernate listeners来做到这一点,这样我就不必向所有进行更改的程序部分添加代码。它运行良好,但我不知道如何确保一致性。

我想,我应该使用 POST_UPDATE(而不是 POST_COMMIT_UPDATE),以便项目和备份都写入同一个事务中。

问题是在 PostUpdateEventListener 中,执行 session.createCriteria(ThingBackup.class)。 ....uniqueResult() 导致 hibernate 中的 ConcurrentModificationException。问题似乎是从迭代更改列表的循环中调用监听器,并且在访问数据库时该列表会被修改(即使是在读取访问上,因为它需要一些刷新)。

我称其为错误,认为它没有违反规范(鉴于 Javadoc 的行数正好为零,没有太多可违反的地方)。它可能有一天会被修复,也可能不会,我需要一个解决方法。看起来旧版本的 hibernate 表现出 different bug in this place .

我可以创建另一个 session 并将其用于所需的工作(读取 ThingBackup,修改它并将其写回)。然而,这样我就得到了两笔交易,万一最后关闭的一笔交易失败,就会出现不一致。

有解决办法吗?或者我可能做错了什么?

最佳答案

来自Interceptor的javadoc :

The Session may not be invoked from a callback (nor may a callback cause a collection or proxy to be lazily initialized).

The same is true用于 JPA 实体生命周期回调。

作为解决方案,您可能需要查看 Hibernate Envers它提供对实体更改的审核。

关于java - Hibernate 监听器中的数据库访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39688013/

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