我有一个实体Parent和一个关系@OneToMany
到另一个实体Child。集合子项设置为延迟加载。
@Entity
class Parent{
@Id
String parentId;
@OneToMany(mappedBy="parent",fetch=FetchType.LAZY)
List<Child> children;
}
@Entity
class Child{
@Id
String childId;
@ManyToOne
@JoinColumn(name="parentId")
Parent parent;
}
List<Parent> loadParents() {
QParent qParent = QParent.parent;
List<Parent> parentList = query.select(qParent).from(qParent).fetch();
return parentList;
}
@Transactional
void test(){
List<Parent> parentList = loadParents();
for(Child child:parentList.getChildren()){
child.getChildId();
}
}
我得到了着名的
在我访问子列表的行上的test()方法中的org.hibernate.LazyInitializationException:懒得初始化 一组角色......无法初始化代理 - 没有会话
异常。
我不想更改实体中的获取类型注释。
如何访问子实体?
答案 0 :(得分:1)
我找到了罪魁祸首。事务管理已禁用。
测试方法中缺少 @Transactional 注释。
要启用事务管理,请将其放在application-context.xml中:
<tx:annotation-driven />
代码没有问题,但配置不完整。为了热切地加载嵌套集合,我们所需要的只是一个拥抱交易。
打开org.springframework.orm和org.hibernate的调试日志记录帮助我找出问题的根源。