【问题标题】:Spring, Hibernate, JPA: Lazy loading id'sSpring,Hibernate,JPA:延迟加载 id
【发布时间】:2015-02-27 14:52:01
【问题描述】:

我目前正在将一个大型项目从 Grails 转换为 Spring:在尝试延迟加载对象 id 而不必选择整个表时,我有点卡住了。

我希望它的工作方式,/Object/

Object
    List<child> children

像这样输出:

{children:[{id:1},{id:2}]}

因此,如果需要,我可以从另一个控制器访问该内部对象,如果需要,可以使用我在所有控制器中实现的常规 CRUD 方法。 /child/1

考虑到 JSON 输出,我在序列化期间无法使用 Session,这是可以理解的,我已经看到诸如在服务层中调用 object.child.getId() 之类的方法对我来说似乎令人难以置信,而且还会导致要延迟加载的整个对象。

总的来说,我希望创建一个简单的 Rest 应用程序,可以轻松自定义 json 输出,grails 用 JSON Marshalling 插件做得非常好:https://grails.org/plugin/marshallers

编辑: 我真的不希望设置预加载,但预加载是一种可能性。有没有办法让 Eager Loading 达到最大深度?

{ 
  children: { //depth 1
              children-children: { //depth 2 (Ignore this) 
              } 
            }
}

【问题讨论】:

    标签: java json spring hibernate jpa


    【解决方案1】:

    您可以使用(这基本上是 object.child.getId hack 的包装器):

    Hibernate.initialize(object.getChildren());
    

    或者为此创建一个特殊查询(这将是最大深度为 1 的急切加载):

    #assuming you use hql, it would look like this
    SELECT e FROM Entity e 
        JOIN FETCH e.children...
    

    也可以使用 CriteriaAPI 和 DetachedCriteria。

    【讨论】:

      【解决方案2】:

      您可以使用@Fetch(FetchMode.SUBSELECT),以便在访问时通过单个辅助查询获取所有未初始化的实体。

      您只需要确保,当访问未初始化的 LAZY 关联时,Hibernate Session 仍然处于打开状态。

      【讨论】:

        最近更新 更多