Spring Boot String + Jpa + Hibernate,仅在特定方法上强制集合急切初始化,而不使用事务

pepwfjgg  于 2023-01-20  发布在  Spring
关注(0)|答案(1)|浏览(95)

很简单的问题,我想要一个简单的答案。
我正在加载一个实体,它有许多关联的延迟集合。由于个人原因,这个加载是在@Transactional方法之外完成的
加载实体后,我尝试加载集合,但出现异常

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注解集合或将@transactional添加到方法

cbjzeqam

cbjzeqam1#

解决的办法很简单,我就分享给大家帮助。
我知道应该有一种方法告诉jpa只为一个特定的查询强制急切加载一个集合,而且确实有这种方法。
在存储库界面中,注解您想要进行即时加载的特定查询

@EntityGraph(attributePaths = {"lazyCollectionA", "lazyCollectionB"}, type = EntityGraph.EntityGraphType.LOAD)
   A find(/*PARAMETERS_HERE*/);

这样,当spring构建这个查询时,它将为指定的集合创建一个内部连接,并立即初始化它们。
另一种方法是在@Query注解中指定整个查询,该注解指定了所需的内部连接。但是,由于我想利用spring自动生成的查询,所以我只使用@EntityGraph

相关问题