非事务加载带懒加载集合的JPA实体后,初始化Hibernate集合报错排查
问题分析与解决
你的问题核心在于:cachedEntity是在当前打开的Session之外加载的游离状态实体,新Session并没有将这个实体纳入自身的持久化上下文管理,所以调用Hibernate.initialize()时,Hibernate无法找到对应的Session来初始化懒加载集合。
修正后的代码示例
final A cachedEntity = aRepository.find(entity.getDocument()); final Session session = sessionFactory.openSession(); session.beginTransaction(); // 关键步骤:将游离实体重新关联到当前Session,转为持久化状态 session.update(cachedEntity); Hibernate.initialize(cachedEntity.getAddresses()); cachedEntity.getAddresses().addAll(entity.getAddresses()); cachedEntity.getPhones().addAll(entity.getPhones()); cachedEntity.getEmails().addAll(entity.getEmails()); session.getTransaction().commit(); // 务必提交事务 session.close();
补充说明
session.update()会将游离状态的实体附加到当前Session,此时实体处于持久化状态,Hibernate可通过当前Session完成懒加载集合的初始化。- 若不确定实体是否已存在于数据库中,也可使用
session.merge(),它会根据实体标识自动判断是附加现有实体还是创建新实体。
内容的提问来源于stack exchange,提问作者Rafael Lima
相关产品推荐
相关产品推荐

