Java 未能延迟初始化集合,从org.hibernate.classic.Lifecycle的onload方法访问时没有会话或会话关闭 代码
l_details的pin具有外部约束,该约束引用x_details主键,这里我使用XDetails类的单向关系 实体: 我使用的是Hibernate3.5.6最终依赖项mysql数据库,我运行的是hibernatestandalone应用程序。Java 未能延迟初始化集合,从org.hibernate.classic.Lifecycle的onload方法访问时没有会话或会话关闭 代码,java,hibernate,Java,Hibernate,l_details的pin具有外部约束,该约束引用x_details主键,这里我使用XDetails类的单向关系 实体: 我使用的是Hibernate3.5.6最终依赖项mysql数据库,我运行的是hibernatestandalone应用程序。 # onload method @Override public void onLoad(Session s, Serializable id) { System.out.println("inside
# onload method
@Override
public void onLoad(Session s, Serializable id) {
System.out.println("inside load");
try{
if((lDetails!=null)){
System.out.println("size of lDetails"+lDetails.size());
}
}
catch(Exception exception){
exception.printStackTrace();
}
}
问题是您选择了
LAZY
加载,但是当您第一次访问集合的元素时,您的会话已经关闭。您需要EAGER
获取您的Set
或保持会话打开,直到所有操作完成。问题是您选择了延迟加载
,但当您第一次访问集合的元素时,会话已经关闭。你需要EAGER
获取你的Set
或保持会话打开,直到所有操作都完成。你能给我们展示一下onLoad方法吗?@overmeulen-thansk看看这个。我已经在XDetails类中编写了onLoad方法。这是Hibernate 3.x的一个已知问题。看,你能给我们看一下onLoad方法吗?@overmeulen-thansk。我已经在XDetails类中编写了onLoad方法。这是Hibernate 3.x的一个已知问题。查看我已使用fetchmode.join覆盖批注设置。请参阅MainThread如果我没有错,setFetchMode将路径作为参数,而不是别名。所以应该是criteria.setFetchMode(“lDetails”,FetchMode.JOIN)您可以删除您的别名。k您所说的是正确的,如果我不访问onload内部的集合,则会出现预期结果。如果我访问onload内部的ldetails,则会再次抛出相同的异常。如果您仍然收到完全相同的错误,则表示您的集合仍然是延迟加载的…感谢您的回复。我在ldetails上添加了渴望抓取,它在单个查询中抓取所有细节。会话关闭后,我可以读取ldetails没有问题。但是,如果我在加载xdetails时读取ldetails,则出现异常。我已使用fetchmode.join覆盖批注设置。请参阅MainThread如果我没有错,setFetchMode将路径作为参数,而不是别名。所以应该是criteria.setFetchMode(“lDetails”,FetchMode.JOIN)您可以删除您的别名。k您所说的是正确的,如果我不访问onload内部的集合,则会出现预期结果。如果我访问onload内部的ldetails,则会再次抛出相同的异常。如果您仍然收到完全相同的错误,则表示您的集合仍然是延迟加载的…感谢您的回复。我在ldetails上添加了渴望抓取,它在单个查询中抓取所有细节。在会话结束后,我可以阅读ldetails,这没有问题。但是如果我在加载的xdetails中阅读ldetails,那么我会得到一个异常。
Session session=HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Criteria criteria=session.createCriteria(XDetails.class);
criteria.createAlias("lDetails", "status",CriteriaSpecification.INNER_JOIN);
criteria.setFetchMode("status", FetchMode.JOIN);
List<XDetails> details=criteria.list();
session.getTransaction().commit();
org.hibernate.LazyInitializationException: failed to lazily initialize a collection, no session or session was closed
at rg.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:383)
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:375)
at org.hibernate.collection.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:122)
at org.hibernate.collection.PersistentSet.size(PersistentSet.java:162)
at com.hibernate.test.pendingdict3.XDetails.onLoad(XDetails.java:588)
at org.hibernate.event.def.DefaultPostLoadEventListener.onPostLoad(DefaultPostLoadEventListener.java:73)
at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:234)
at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:898)
at org.hibernate.loader.Loader.doQuery(Loader.java:773)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:270)
at org.hibernate.loader.Loader.doList(Loader.java:2449)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2192)
at org.hibernate.loader.Loader.list(Loader.java:2187)
at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:119)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1706)
at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:347)
at com.hibernate.test.main4.HibernateStandaloneMain.main(HibernateStandaloneMain.java:24)
# onload method
@Override
public void onLoad(Session s, Serializable id) {
System.out.println("inside load");
try{
if((lDetails!=null)){
System.out.println("size of lDetails"+lDetails.size());
}
}
catch(Exception exception){
exception.printStackTrace();
}
}