一般出现在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())
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐