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仍然是打开的。
我目前正在将一个大型项目从 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仍然是打开的。