Spring、Hibernate、JPA:延迟加载 ID

Spring, Hibernate, JPA: Lazy loading id's

我目前正在将一个大型项目从 Grails 转换为 Spring:在尝试延迟加载对象 ID 而不必 select 整个 table。

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

Object
    List<child> children

这样输出:

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

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

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

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

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

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

您可以使用(这基本上是 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。

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

你只需要确定,当未初始化的LAZY关联被访问时,Hibernate Session仍然是打开的。