我对一个问题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异常。错误是
无法初始化代理 - 没有会话
我迫切需要一些帮助,因为我不知道发生了什么。我刚刚将代码复制到一个新类中并且失败了。
答案 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。