java 如何在从缓存中获取父集合后获取惰性初始化的集合?

pbwdgjma  于 2023-05-27  发布在  Java
关注(0)|答案(1)|浏览(91)
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可能会解决这个问题,但我不想使用它。

oug3syen

oug3syen1#

看起来当你试图访问延迟加载的对象时,你的Hibernate会话已经关闭了,因此出现了异常。
你是否有条件地加载这个B集合?如果是,那么将其设置为LAZY是有意义的,但如果您总是加载它,那么您可以考虑加载它EAGERLY
您可以在从事务中访问Hibernate.initialize(a.getB())之前尝试调用它以使其工作。

相关问题