我写了一小段这样的代码。我需要所有的学生,他们打电话给一对多的关系。
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.
我的问题是我做错了如何应用过滤器并正确地获得连接非常感谢。
答案 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)来在类级别上获取提取。