首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Hibernate - 无法连接获取第二个惰性字段

Hibernate - 无法连接获取第二个惰性字段
EN

Stack Overflow用户
提问于 2019-03-20 00:31:04
回答 1查看 0关注 0票数 0
代码语言:javascript
复制
public class Aaa{
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "bbb")
    private BBB bbb;
}

public class BBB{
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "ccc")
    private CCC ccc;
}

public class CCC{
    //other fields
    @Column(name = "zzz")
    private String zzz;
}

使用HQL查询FROM AAA a JOIN FETCH a.bbb b JOIN FETCH b.ccc

但是,当我这样做时,c.getZzz();得到了例外

org.hibernate.LazyInitializationException:无法初始化代理 - 没有会话

如何在不设置的情况下修复此问题EAGER

EN

回答 1

Stack Overflow用户

发布于 2019-03-20 10:11:01

看起来您的实体正在与会话分离,并且Hibernate仅通过会话访问数据库,因此如果实体与会话分离并且您尝试访问尚未加载的关联(通过代理或集合包装器) ,Hibernate throws a LazyInitializationException。 请插入调用以检查会话附件,否则请附加到会话中。

代码语言:javascript
复制
if (session.contains(c))
{
    //value exists, access it
    c.getZzz()
}
else 
{
    session.merge(c);
}

来自hibernate javadoc的参考

通过调用save(),persist()或saveOrUpdate()可以使瞬态实例持久化。通过调用delete()可以使持久化实例成为瞬态。get()或load()方法返回的任何实例都是持久的。可以通过调用update(),saveOrUpdate(),lock()或replicate()使分离的实例持久化。通过调用merge(),瞬态或分离实例的状态也可以作为新的持久实例持久化。

要强制会话持续直到加载所有数据,请使用事务。确保所有get调用都在事务下执行。 如果使用spring,annotate方法使用@Transactional和使用@EnableTransactionManagement配置类或<tx:annotation-driven/>使用spring xml。并确保您的bean在春季环境中管理,否则@Transactional将无效。 检查这个的简单方法是TransactionSynchronizationManager.isActualTransactionActive()在您的访问方法中打印,true否则输出应该找出您的spring bean的配置错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100006468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档