org.hibernate.LazyInitializationException:无法初始化代理 - 拥有的会话已关闭

Alo*_*lok 2 session hibernate initialization exception lazy-evaluation

我继续收到此错误"线程中的异常"主"org.hibernate.LazyInitializationException:无法初始化代理 - 拥有的会话已关闭",当我运行以下代码时:

public ArrayList<ProfileDTO> getInitialProfiles(Contracts ct){ 
   SessionFactory sessionFactory=new Configuration().configure().buildSessionFactory();
   Session session=sessionFactory.openSession();
   Transaction tx=session.beginTransaction(); 
   ArrayList<ProfileDTO> profileDTOs=new ArrayList<ProfileDTO>();
   try{
       Hibernate.initialize(ct);
        SQLQuery query=session.createSQLQuery("select {b.*},{p.*},{t.*} from bidtool.bt_boiler_plates b,bidtool.bt_profile p,bidtool.bt_trade_lane t where b.contract_id=:val AND p.contract_id=:val AND t.contract_id=:val")
                  .addEntity("b",Boiler_Plates.class)
                  .addEntity("p",BidToolProfiles.class)
                  .addEntity("t",BidToolTradeLanes.class);
        query.setParameter("val", ct.getContract_id());
        List list=query.list();  

        Iterator iteContract = list.iterator();
        while ( iteContract.hasNext() ) {
            Object[] pair =(Object[]) iteContract.next();
            Boiler_Plates bp=(Boiler_Plates)pair[0];
            BidToolProfiles p=(BidToolProfiles)pair[1];
            ProfileDTO profileDTO=new ProfileDTO();
            profileDTO.setProfileId(p.getProfileId());
            profileDTO.setBt_contracts(p.getBt_contracts());
            profileDTO.setCreated(p.getCreated());
            profileDTO.setProfileContent(p.getProfileContent());
            profileDTO.setEditable(p.getEditable());
            profileDTO.setProfileName(p.getProfileName());
            profileDTOs.add(profileDTO);
        } 
        return profileDTOs;
   }
   catch(Exception ex){
       System.out.println(ex.getMessage());
       return profileDTOs;
   }
   finally{
    session.flush();   
    session.close();
   }
 }
Run Code Online (Sandbox Code Playgroud)

每当我不关闭会话时它都可以正常工作,但我不能这样做.我需要关闭会话.我们将不胜感激.谢谢.

Jes*_*run 5

在会话关闭后访问hibernate实体中的关联或集合时会引发错误.看看你的代码,我猜这个问题可能在于以下几行:

profileDTO.setBt_contracts(p.getBt_contracts());

当您尝试从其他会话中的代码中的其他位置访问此集合时.

尝试将您的查询更改为:

select {b.*},{p.*},{t.*} from bidtool.bt_boiler_plates b,bidtool.bt_profile p,bidtool.bt_trade_lane t left join fetch p.bt_contracts btcontracts where b.contract_id=:val AND p.contract_id=:val AND t.contract_id=:val

请注意,我在集合中添加了一个连接提取.这应该确保在获取BidToolProfiles实体的同时获取合同集合.在DTO中设置之前,请尝试初始化集合.

Hibernate.initialize(p.getBt_contracts());
profileDTO.setBt_contracts(p.getBt_contracts());
Run Code Online (Sandbox Code Playgroud)