从多个线程修改休眠实体

Raf*_*fal 6 java multithreading hibernate

我在理解Hibernate. 我知道它们Hibernate Sessions本身并不是线程安全的,所以我不会从多个线程访问它们。但是,我找不到有关 Hibernate 实体的线程安全性的任何信息。我可以在多个线程中修改它们,而它们仍然连接到用于加载它们的 Session 吗?

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

我设想的场景:

  • 使用 Hibernate Session 从数据库加载实体 A,
  • 随后,从多个线程修改实体A,而不是加载实体的线程,
  • 实体 A 始终连接到 Session 并处于持久状态,
  • 刷新会话以便修改与数据库同步。
  • 实体 A 保持连接到会话,因此循环可以重复,进一步修改和刷新。

Dra*_*vic 4

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

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

但是,不建议这样做。

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

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