Java 如何解决org.hibernate.LazyInitializationException?

Java 如何解决org.hibernate.LazyInitializationException?,java,hibernate,Java,Hibernate,org.hibernate.LazyInitializationException:未能延迟初始化角色集合:com.t4bt.gov.persistence.entities.Experts.InstituteOnlist,未关闭任何会话或会话您的问题(代码?)中提供的细节很少,因此它必须是关于延迟加载的一般答案。将来,如果您想要答案,请提供有关实际问题的具体信息,以及您试图解决的问题的描述 在会话关闭后(通常在事务结束后)尝试访问延迟加载的属性时,会发生懒散初始化。惰性初始化的工作方式是,当您

org.hibernate.LazyInitializationException:未能延迟初始化角色集合:com.t4bt.gov.persistence.entities.Experts.InstituteOnlist,未关闭任何会话或会话

您的问题(代码?)中提供的细节很少,因此它必须是关于延迟加载的一般答案。将来,如果您想要答案,请提供有关实际问题的具体信息,以及您试图解决的问题的描述

在会话关闭后(通常在事务结束后)尝试访问延迟加载的属性时,会发生懒散初始化。惰性初始化的工作方式是,当您获取对象时,它不会获取惰性初始化的属性,但是当您实际尝试访问它时,Hibernate会对数据库执行另一个查询来获取它

以下情况会产生此类错误:

public class Something {
    [...]
    @OneToMany(fetch = FetchType.LAZY)
    private List<SomethingElse> somethingElse;

    public List<SomethingElse> getSomethingElse() {
        return somethingElse;
    }
}

public class SomethingDao {
    @Inject
    private EntityManager em;

    @Transactional
    public Something getById(final Integer id) {
        return em.find(Something.class, id);
    }
}

public class SomethingService {
    @Inject
    private SomethingDao dao;

    public List<SomethingElse> getSomethingElseForSomething(final Integer somethingId) { 
        final Something something = dao.getById(somethingId);
        return something.getSomethingElse() //Throws LazyInitializationException
    }
}
公共类{
[...]
@OneToMany(fetch=FetchType.LAZY)
私人物品清单;
公共列表getSomethingElse(){
回报一些东西;
}
}
公共类SomethingDao{
@注入
私人实体管理者;
@交易的
public getById(最终整数id){
返回em.find(Something.class,id);
}
}
公共类某物服务{
@注入
私密的东西道道;
公共列表GetSomeThingElsforSomething(最终整数somethingId){
final Something=dao.getById(somethingId);
return somethingelse()//抛出LazyInitializationException
}
}
这里事务(以及会话)只存在于dao类中。一旦离开dao方法,会话就消失了。因此,当您尝试访问服务中的延迟加载属性时,当Hibernates尝试联系会话以检索它时,它将失败

为了避免这种情况,有几种可能性

  • 将Something类的注释更改为
    @OneToMany(fetch=FetchType.EAGER)
    属性不再是延迟加载的,因此不再存在问题
  • @Transactional
    添加到服务方法。然后,对
    getSomethingElse()
    的调用将与获取某物对象处于同一事务中,并且执行此操作时会话仍处于活动状态
  • 在Dao方法中添加对
    getSomethingElse()
    的调用。然后,它将在离开Dao类(和事务)之前初始化属性(从数据库中获取),并且它将在事务外部可用,无需与会话通信来检索它

  • 您在问题(代码?)中提供的细节很少,因此它必须是关于延迟加载的一般性答案。将来,如果您想要答案,请提供有关实际问题的具体信息,以及您试图解决的问题的描述

    在会话关闭后(通常在事务结束后)尝试访问延迟加载的属性时,会发生懒散初始化。惰性初始化的工作方式是,当您获取对象时,它不会获取惰性初始化的属性,但是当您实际尝试访问它时,Hibernate会对数据库执行另一个查询来获取它

    以下情况会产生此类错误:

    public class Something {
        [...]
        @OneToMany(fetch = FetchType.LAZY)
        private List<SomethingElse> somethingElse;
    
        public List<SomethingElse> getSomethingElse() {
            return somethingElse;
        }
    }
    
    public class SomethingDao {
        @Inject
        private EntityManager em;
    
        @Transactional
        public Something getById(final Integer id) {
            return em.find(Something.class, id);
        }
    }
    
    public class SomethingService {
        @Inject
        private SomethingDao dao;
    
        public List<SomethingElse> getSomethingElseForSomething(final Integer somethingId) { 
            final Something something = dao.getById(somethingId);
            return something.getSomethingElse() //Throws LazyInitializationException
        }
    }
    
    公共类{
    [...]
    @OneToMany(fetch=FetchType.LAZY)
    私人物品清单;
    公共列表getSomethingElse(){
    回报一些东西;
    }
    }
    公共类SomethingDao{
    @注入
    私人实体管理者;
    @交易的
    public getById(最终整数id){
    返回em.find(Something.class,id);
    }
    }
    公共类某物服务{
    @注入
    私密的东西道道;
    公共列表GetSomeThingElsforSomething(最终整数somethingId){
    final Something=dao.getById(somethingId);
    return somethingelse()//抛出LazyInitializationException
    }
    }
    
    这里事务(以及会话)只存在于dao类中。一旦离开dao方法,会话就消失了。因此,当您尝试访问服务中的延迟加载属性时,当Hibernates尝试联系会话以检索它时,它将失败

    为了避免这种情况,有几种可能性

  • 将Something类的注释更改为
    @OneToMany(fetch=FetchType.EAGER)
    属性不再是延迟加载的,因此不再存在问题
  • @Transactional
    添加到服务方法。然后,对
    getSomethingElse()
    的调用将与获取某物对象处于同一事务中,并且执行此操作时会话仍处于活动状态
  • 在Dao方法中添加对
    getSomethingElse()
    的调用。然后,它将在离开Dao类(和事务)之前初始化属性(从数据库中获取),并且它将在事务外部可用,无需与会话通信来检索它
  • 可能的重复可能的重复