gpt4 book ai didi

java - 从多个线程修改 hibernate 实体

转载 作者:搜寻专家 更新时间:2023-11-01 03:02:24 25 4
gpt4 key购买 nike

我在理解 Hibernate 中线程安全的细节方面遇到了问题。我知道 Hibernate Sessions 本身不是线程安全的,所以我不会从多个线程访问它们。但是,我找不到任何关于 Hibernate 实体线程安全的信息。我可以在多个线程中修改它们,同时它们仍然附加到用于加载它们的 session 吗?

我不会使用延迟加载(我知道这会导致并发问题)。实体将被正确同步, hibernate 将通过同步的 getter 访问它们。

我设想的场景:

  • 使用 Hibernate Session 从数据库加载实体 A,
  • 随后,从加载实体的线程以外的多个线程修改实体 A,
  • 实体 A 一直附加到 session 并处于持久状态,
  • 刷新 session ,使修改与数据库同步。
  • 实体 A 仍然附加到 session ,因此循环可以重复,并进行进一步的修改和刷新。

最佳答案

这取决于修改的性质。如果您通过在另一个线程中创建、持久化和关联另一个实体来修改一个实体,那么它将不起作用,因为另一个实体实例将被视为在第一个线程中分离。

撇开上面的用例不谈,这在理论上应该是可行的,并且前提是您不使用字节码工具进行脏检查。 Hibernate 只会在需要刷新时检查对象是否脏;基本上,它不关心您如何修改对象。

但是,不推荐这样做。

首先,它可能与 Hibernate/JPA 的 future 版本不兼容(可能会有更多限制阻止对实体的并发访问)。

其次,解决方法相当简单:只需为要同时修改的数据创建 DTO,提交处理,处理完成后更新实体即可。这样代码会更清晰,不会出现意外的 Hibernate 线程相关投诉,并且您可以灵活地使用延迟加载等其他有用的功能。

关于java - 从多个线程修改 hibernate 实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32549386/

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