【问题标题】:How do I lazy load a nested collection?如何延迟加载嵌套集合?
【发布时间】:2016-11-25 07:09:33
【问题描述】:

我有一个实体 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() 方法中出现异常。

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

如何访问子实体?

【问题讨论】:

    标签: jpa querydsl


    【解决方案1】:

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

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

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

    <tx:annotation-driven />
    

    代码没有问题,但配置不完整。为了急切地加载嵌套集合,我们只需要一个包含事务。

    打开 org.springframework.orm 和 org.hibernate 的调试日志有助于我确定问题的根源。

    类似问答:LazyInitializationException in JPA and Hibernate

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-23
      • 1970-01-01
      • 2010-11-19
      • 1970-01-01
      • 2016-12-21
      • 1970-01-01
      • 1970-01-01
      • 2020-06-13
      相关资源
      最近更新 更多