繁体   English   中英

String + Jpa + Hibernate,只在没有事务的特定方法上强制集合热切初始化

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM