带有内部Criteria的Java Hibernate JOIN抛出没有会话或会话被关闭

时间:2013-05-16 20:58:27

标签: java hibernate

我写了一小段这样的代码。我需要所有的学生,他们打电话给一对多的关系。

public ArrayList<Student>getListOfStudents()
{        
    Session session = getHibernateTemplate().getSessionFactory().openSession();        
    Criteria like = session.createCriteria(Student.class).setFetchMode("phone",FetchMode.JOIN).setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
    prepareForSelect(like);//some filtering       
    like.addOrder(Order.asc("name"));        
    ArrayList<Student> results = new ArrayList<Student>(like.list());
    session.close();
    return results;
}

这工作非常好,但我需要调整它,因为我需要在手机中实现相同的标准过滤,我已经将我的片段重新设计为类似的东西。

public ArrayList<Student>getListOfStudents()
{        
    Session session = getHibernateTemplate().getSessionFactory().openSession();        
    Criteria like = session.createCriteria(Student.class).setFetchMode("phone",FetchMode.JOIN).setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
    prepareForSelect(like);//some filtering       
    Criteria innerCriteria = like.createCriteria("phone");
    prepareForSelect(innerCriteria);//same filtering but in phone now..
    like.addOrder(Order.asc("c01"));        
    ArrayList<Student> results = new ArrayList<Student>(like.list());
    session.close();
    return results;
}

但是hibernate已从左外连接更改为内连接,当我以相同的方法运行数据时,代码运行之前我可以看到错误抛出。

Exception in thread "main" org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.generic.model.Student.phone, no session or session was closed.

我的问题是我做错了如何应用过滤器并正确地获得连接非常感谢。

1 个答案:

答案 0 :(得分:0)

嗯,问题是学生的电话并不急切。由于您正在关闭会话,因此当您尝试访问手机时,您将获得LazyInitializationException

但是你问自己我已经使用setFetchMode("phone",FetchMode.JOIN)将获取模式设置为渴望并且它工作得很好。问题是,Hibernate中存在一个错误,当您向条件添加内部查询时,它会禁用急切提取。它仍然是开放的。见这里:

https://hibernate.atlassian.net/browse/HHH-3524

如果你有时间,你可以看看这里:

https://forum.hibernate.org/viewtopic.php?f=1&t=944439

如果你这样做,请确保你阅读第二页,它会变得更有趣。

所以我的建议是通过使用fetch=FetchType.EAGER或切换到CriteriaBuilder(JPA)来在类级别上获取提取。