0

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

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;
}

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

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.

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

4

1 回答 1

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) 在类级别上进行获取。

于 2013-05-19T16:17:07.713 回答