懒惰加载中的奇怪问题

时间:2017-09-18 13:40:57

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

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

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

所以旧控制器看起来像

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

  @Inject
  private AssignmentListService assignmentListService;

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

REST函数列表调用AssignmentListService来加载赋值,这是一个集合,并且懒惰地加载一些数据。它的作品很棒。

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

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

  @Inject
  private AssignmentDtoMapper assignmentDtoMapper;

  public list() {...}
}

除了使用MapStruct创建的AssignmentDtoMapper bean之外,代码是相同的。

现在问题是,当我调用这个新服务时,不知怎的,我得到了一个Lazy Load异常。错误是

  

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

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

1 个答案:

答案 0 :(得分:0)

异常实际上非常清楚,Hibernate无法加载延迟获取的成员,因为当你点击它时没有打开持久性上下文。

我想在V2中:

@Inject
private AssignmentDtoMapper assignmentDtoMapper;

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

如果你想避免在unitiliazed代理上的例外,你可以尝试类似

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

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

    return obj != null;   
}

如果作为bean获取的成员,则返回true,否则为false。