一般出现在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只在实体对象想使用其关联对象时进行才进行查询数据库加载,可是你查询实体对象语句结束后会话就失效了,从而加载不了关联对象
解决方案
-
懒加载改为急加载
= 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())