DAO代码
public interface UserRepository extends JpaRepository<User,Integer> {
}
Controller
@RestController
public class JpaController {
@Autowired
UserRepository userRepository;
@GetMapping("/user/{id}")
//@Transactional
public User getUser(@PathVariable("id") Integer id){
User user = userRepository.getOne(id);
return user;
}
}
请求
localhost:8080/user/1
时,查询报错。
错误详情
There was an unexpected error (type=Internal Server Error, status=500).
Type definition error: [simple type, class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor];
nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException:
No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor and
no properties discovered to create BeanSerializer
(to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)
(through reference chain: com.dysy.sbjpa.entity.XXX
$HibernateProxy$Z8tP2uCb["hibernateLazyInitializer"])
org.hibernate.LazyInitializationException:
failed to lazily initialize a collection of role:
XXX, could not initialize proxy - no Session
错误原因
getOne()
方法使用的懒加载,获取到的只是代理对象。
解决办法
方法一
在要操作的实体类前加上 @Proxy(lazy = false)
关闭懒加载
@Proxy(lazy = false)
public class User{
……
}
方法二
在要操作的实体类前加上@JsonIgnoreProperties(value = {"hibernateLazyInitializer", "handler"})
,转为 json 的时候忽略 hibernateLazyInitializer
、 handler
@JsonIgnoreProperties(value = {"hibernateLazyInitializer", "handler"})
public class User {
……
}