如何延迟加载嵌套集合?

时间:2016-07-21 15:35:52

标签: jpa querydsl

我有一个实体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();
    }
}

我得到了着名的

  

org.hibernate.LazyInitializationException:懒得初始化   一组角色......无法初始化代理 - 没有会话

在我访问子列表的行上的test()方法中的

异常。

我不想更改实体中的获取类型注释。

如何访问子实体?

1 个答案:

答案 0 :(得分:1)

我找到了罪魁祸首。事务管理已禁用。

测试方法中缺少 @Transactional 注释。

启用事务管理,请将其放在application-context.xml中:

<tx:annotation-driven />

代码没有问题,但配置不完整。为了热切地加载嵌套集合,我们所需要的只是一个拥抱交易。

打开org.springframework.orm和org.hibernate的调试日志记录帮助我找出问题的根源。

类似的问题和答案:LazyInitializationException in JPA and Hibernate