解决: failed to lazily initialize a collection of role: XXX, could not initialize proxy - no Session

文章讨论了在Hibernate框架中遇到的懒加载问题,当尝试获取实体类的关联对象时,由于会话已结束导致加载失败。提出了两种解决方案:一是将懒加载改为急加载,但可能造成不必要的性能开销;二是通过添加@Transaction注解确保在同一会话内加载关联对象,使用Hibernate.initialize()方法强制初始化关联集合。
摘要由CSDN通过智能技术生成

一般出现在Hibernate框架下,实体类中关联着其他实体类(一对多等关系),并且关联对象还是其懒加载fetch = FetchType.LAZY


    @OneToMany(mappedBy = "template", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
    @SortNatural
    @org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
    private SortedSet<ApplicationTemplateAttribute> attributeValues = new TreeSet<ApplicationTemplateAttribute>();

在查询出该实体对象时想使用其关联对象时比如get()等操作,就会报标题错误,主要原因是不在同一会话中,FetchType.LAZY只在实体对象想使用其关联对象时进行才进行查询数据库加载,可是你查询实体对象语句结束后会话就失效了,从而加载不了关联对象

解决方案

  1. 懒加载改为急加载


= FetchType.EAGER

这样当查询实体对象时会自动查询其关联对象,但是既然都用上了懒加载,说明我们项目业务需求有时候是不需要加载这关联对象的,每次都加载不太符合业务需要,性能浪费

 2.使其在同一会话中查询

查询实体对象算一次查询,又要查询其关联对象又是一次查询,两次查询两个会话,使其在同一会话中,最简单的方法就是给service层中的业务方法加上事务注解,使其会话在方法执行结束后失效


    @Transactional(readOnly = true)
    @Override
    public ApplicationTemplate getTemplate(String templateId) {
        ApplicationTemplate applicationTemplate = this.getApplicationTemplate(templateId);
        Hibernate.initialize(applicationTemplate.getAttributeValues());
        return applicationTemplate;
    }

这个是强制加载该实体对象中的关联对象,只要对象get其关联对象就行


  Hibernate.initialize(applicationTemplate.getAttributeValues())
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值