【问题标题】:Weird issue in Lazy load延迟加载中的奇怪问题
【发布时间】:2017-09-18 13:40:57
【问题描述】:

我完全对 Spring data + hibernate 的一个问题感到困惑

我们有一项正在迁移到 V2 的 Restful 服务。

所以旧控制器看起来像

@Api(tags = {"assignments"})
@RestController
@CheckedTransactional
public class AssignmentListController {

  @Inject
  private AssignmentListService assignmentListService;

  //REST function
  public list() {....}
}

REST函数列表调用AssignmentListService加载assignment,这是一个集合,懒加载一些数据。它的作品非常好。

我所做的是将这个控制器复制为名称AssignmentListControllerV2,它看起来像

@Api(tags = {"assignments"})
@RestController
@CheckedTransactional
public class AssignmentListControllerV2 {
  @Inject
  private AssignmentListService assignmentListService;

  @Inject
  private AssignmentDtoMapper assignmentDtoMapper;

  public list() {...}
}

代码相同,只是添加了AssignmentDtoMapper bean,它是使用MapStruct创建的。

现在的问题是,当我调用这个新服务时,不知何故我得到了一个延迟加载异常。错误是

无法初始化代理 - 没有会话

我非常需要一些帮助,因为我不知道发生了什么。我刚刚将代码复制到一个新类中,但它失败了。

【问题讨论】:

  • 我想如果你再分享一些代码会很好。您的实体、服务方法,并解释在将所有内容发送回客户端之前如何转换它(在两个版本中)。你的映射器是做什么的?
  • 代码太大了,我不能分享,它也是一个现有的应用程序,由于隐私,我不确定我是否可以分享它的代码,我也怀疑服务代码是否有任何区别相同的代码在 V1 中运行良好。
  • 显然异常结果是不同的。这些 Lazy 对象从未作为默认查询的一部分加载,但定义了一个 Aspect,稍后在对象上设置该数据。方面设置在模式 .*Controller. 上的事实,不幸的是我的控制器的名称是 ControllerV2,这导致了问题。无论如何,感谢您的帮助。

标签: spring spring-data spring-data-rest


【解决方案1】:

这个异常其实很明显,Hibernate 无法加载lazy fetched 成员,因为你点击它时没有打开持久化上下文。

我想在 V2 中:

@Inject
private AssignmentDtoMapper assignmentDtoMapper;

是将一些JPA业务实体更改为DTO吗? 如果您尝试将未加载的成员映射到那里,这可能是异常的来源。

如果你想避免统一代理的异常,你可以尝试类似

public boolean isProxyInitialized(Object obj){
    if(obj instanceof HibernateProxy){
        HibernateProxy proxy = (HibernateProxy) obj;

        return !proxy.getHibernateLazyInitializer().isUninitialized();
    }

    return obj != null;   
}

如果成员作为 bean 被提取,它应该返回 true,否则返回 false。

【讨论】:

  • 显然异常结果是不同的。这些惰性对象从未作为默认查询的一部分加载,但是定义了一个方面,稍后在对象上设置该数据。方面设置在模式 *.*Controller. 上的事实,不幸的是我的控制器的名称是 ControllerV2,这导致了问题。无论如何,感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-23
  • 2012-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多