LazyInitialization Hibernate

时间:2012-12-04 12:21:43

标签: spring hibernate

我遇到了这种类型的错误。原因是因为我正在使用sessionFactory beand和transactionmanager。基本上我用google搜索并说将列设置为FetchType.EAGER。 但即使我这样做了,它仍然显示出同样的错误,就好像什么也没发生一样。请帮忙。

谢谢

错误: org.hibernate.LazyInitializationException:懒得初始化一个角色集合:com.database.entity.User.roles,没有关闭会话或会话

POJOS:
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER, mappedBy="user")
public Set<Role> getRoles() {
return this.roles;
}

3 个答案:

答案 0 :(得分:1)

这可能是一个交易问题。标记提取用户并使用注释@Transactional检查其角色的方法(或测试)。检索用户后,将关闭数据库会话。因此,当您尝试获取用户的角色时,您会收到“无会话或会话已关闭”错误。

必须提供更多信息(例如调用方法代码列表)才能确定。

答案 1 :(得分:0)

在关闭Hibernate会话之前,我会尝试Hibernate.initialize( pojo.getRoles() );

答案 2 :(得分:0)

可能在你提到的LAZY的角色侧映射中,你在这里提到了EAGER。这就是为什么它可能会给出错误。 我认为,对此的实际解决方案是......给LAZY而不是给予EAGER并使用         状态,Hibernate.initialize(yourset);在您想要加载此集的DAO实现中。在我的情况下,我使用findById加载集:

     @Override
    public Branch findByBranchId(Long id) {
            Branch branch=findById(id);
            Hibernate.initialize(branch);
            Hibernate.initialize(branch.getEmployeeSet());
            return branch;
       }

Hibernate.initialize(SetYouWantToFetch)将解决您使用获取类型问题:LAZY