很简单的问题,我想要一个简单的答案。
我正在加载一个实体,它有许多关联的延迟集合。由于个人原因,这个加载是在@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添加到方法
1条答案
按热度按时间cbjzeqam1#
解决的办法很简单,我就分享给大家帮助。
我知道应该有一种方法告诉jpa只为一个特定的查询强制急切加载一个集合,而且确实有这种方法。
在存储库界面中,注解您想要进行即时加载的特定查询
这样,当spring构建这个查询时,它将为指定的集合创建一个内部连接,并立即初始化它们。
另一种方法是在
@Query
注解中指定整个查询,该注解指定了所需的内部连接。但是,由于我想利用spring自动生成的查询,所以我只使用@EntityGraph