Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 未能延迟初始化集合,从org.hibernate.classic.Lifecycle的onload方法访问时没有会话或会话关闭 代码_Java_Hibernate - Fatal编程技术网

Java 未能延迟初始化集合,从org.hibernate.classic.Lifecycle的onload方法访问时没有会话或会话关闭 代码

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

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