![](/img/trans.png)
[英]How to turn on eager initialization in Hibernate throught method calling
[英]String + Jpa + Hibernate, force collection eager initialization on only specific method without transaction
非常简单的问题,我想要一个简单的答案。
我正在加载一个关联了许多惰性集合的实体。 出于个人原因,此加载是在 @Transactional 方法之外完成的
加载实体后,我尝试加载 collections 但出现异常
final A cachedEntity = aRepository.find(entity.getDocument());
final Session session = sessionFactory.openSession();
session.beginTransaction();
Hibernate.initialize(cachedEntity.getAddresses()); // exception right here
cachedEntity.getAddresses().addAll(entity.getAddresses());
cachedEntity.getPhones().addAll(entity.getPhones());
cachedEntity.getEmails().addAll(entity.getEmails());
session.close();
failed to lazily initialize a collection of role: addresses, could not initialize proxy - no Session
这应该是超级简单的,我做错了什么?
请不要建议使用 eager 注释 collections 或将 @transactional 添加到方法中
解决方案很简单,我会分享以帮助他人。
我知道应该有一种方法可以告诉 jpa 仅针对一个特定查询强制预加载集合,而且确实存在。
在存储库界面中注释您想要预先加载的特定查询
@EntityGraph(attributePaths = {"lazyCollectionA", "lazyCollectionB"}, type = EntityGraph.EntityGraphType.LOAD)
A find(/*PARAMETERS_HERE*/);
这样,当 spring 构建此查询时,它将为指定的 collections 创建一个内部连接并急切地初始化它们。
另一种方法是在@Query
注释中指定整个查询,指定您想要的内部联接。 但因为我想利用 spring 自动生成的查询,所以我只使用 @EntityGraph
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.