延迟加载中的奇怪问题

Weird issue in Lazy load

我完全被一个问题搞糊涂了Spring data + hibernate

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

所以旧控制器看起来像

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

  @Inject
  private AssignmentListService assignmentListService;

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

REST函数list调用AssignmentListService加载assignments,它是一个集合,懒加载一些数据。它的作品非常棒。

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

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

  @Inject
  private AssignmentDtoMapper assignmentDtoMapper;

  public list() {...}
}

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

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

could not initialize proxy - no Session

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

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

我想在 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 提取的成员应该 return 为真,否则为假。