A{
Intger id;
String name;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "b_id")
private B b;
}
B{
Integer id;
String name;
}
在Sping Boot 调用findById(由@Cacheable注解)缓存对象A之后,当下次从缓存中获取时,如果代码a.getB().getId()运行,则我收到以下错误:
org.hibernate.LazyInitializationException: could not initialize proxy [com.freit.medicalservice.entity.B#1] - no Session
我尝试了以下解决方案:
1.使用Hibernate.initalize(obj)[也使用Hibernate.isInitialized(obj),在使用Hibernate.initalize(obj)之前返回true]
1.使用@beijiaxu在本帖提出的解决方案sprng boot jpa + redis LazyInitializationException
1.保存FETCH_TYPE.EAGER可能会解决这个问题,但我不想使用它。
1条答案
按热度按时间oug3syen1#
看起来当你试图访问延迟加载的对象时,你的Hibernate会话已经关闭了,因此出现了异常。
你是否有条件地加载这个B集合?如果是,那么将其设置为
LAZY
是有意义的,但如果您总是加载它,那么您可以考虑加载它EAGERLY
。您可以在从事务中访问
Hibernate.initialize(a.getB())
之前尝试调用它以使其工作。