Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring、Hibernate、JPA:延迟加载id_Java_Json_Spring_Hibernate_Jpa - Fatal编程技术网

Java Spring、Hibernate、JPA:延迟加载id

Java Spring、Hibernate、JPA:延迟加载id,java,json,spring,hibernate,jpa,Java,Json,Spring,Hibernate,Jpa,我目前正在将一个大型项目从Grails转换为Spring:当我尝试延迟加载对象id而不必选择整个表时,我有点卡住了 我希望它的工作方式,/Object/: 因此,如果需要,我可以从另一个控制器访问该内部对象,使用我在所有控制器上实现的常规CRUD方法/儿童/1 考虑到JSON输出,我在序列化过程中遇到了会话不可用的问题,这是可以理解的,我见过在服务层中调用object.child.getId之类的方法,对我来说,这似乎是令人难以置信的黑客行为,而且还会导致整个对象被延迟加载 总的来说,我希望创建

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

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

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

考虑到JSON输出,我在序列化过程中遇到了会话不可用的问题,这是可以理解的,我见过在服务层中调用object.child.getId之类的方法,对我来说,这似乎是令人难以置信的黑客行为,而且还会导致整个对象被延迟加载

总的来说,我希望创建一个简单的Rest应用程序,可以轻松定制json输出,grails在json编组插件中做得非常好:

编辑: 我真的不想设置快速加载,但是快速加载是可能的。有没有办法获得最大深度的快速装载

{ 
  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。

您可以使用,以便在访问时使用单个辅助查询获取所有未初始化的实体

您只需确保,当访问未初始化的惰性关联时,Hibernate会话仍处于打开状态

Hibernate.initialize(object.getChildren());
#assuming you use hql, it would look like this
SELECT e FROM Entity e 
    JOIN FETCH e.children...