在线程中获取休眠延迟加载对象

问题描述 投票:0回答:1

我正在使用 Hibernate 5.3、Spring 和 Java 8。 我们的应用程序是一个企业应用程序,最初是在 struts 上创建的,然后在 Spring 中进行一些新的开发。 Spring 没有正确配置,我们只是用它来暴露端点,即控制器。

我有 6 种不同类型的对象(彼此不相关),它们根据创建者 ID 分组在一起。

为了提高性能,我使用并行流中所有对象的(输入)标准来获取对象,并将它们存储在基于其对象类型作为键和对象列表作为值的映射中。现在我想将所有这些对象转换为 bean。由于有 6 种类型的对象,总共有 2000-3000 个对象,API 超时(>30 秒),我也想并行转换它们。

为此,我使用了 Executor 服务,并将每个对象的列表传递给不同的方法,以将它们转换为新实体。由于对象是延迟加载的,并且不允许我急切加载,也没有在我们的应用程序中配置

@Transactional
,所以我收到了延迟初始化异常。

我该如何解决这个问题?

我应该在每种转换方式中打开交易吗?

我应该将会话传递给线程吗?

java hibernate lazy-loading transactionscope lazy-initialization
1个回答
0
投票

如果您正在构建服务,我会在服务的公共方法上打开事务(即 Hibernate Session),而不是在 DAO 上。这将解决任何“延迟加载异常”。

如果您位于打开会话的另一个线程中,则 Hibernate 会话将丢失。因此,当在线程之间传递对象时,传递 ID,您就可以在另一个休眠会话中重新加载实体。

© www.soinside.com 2019 - 2024. All rights reserved.