Hibernate lazy fetch无法加载子对象
我有很多子对象的父对象,所以不能使用。 我尝试了多种样式来获取父对象的所有子对象,但是 下面的代码,以及我尝试过的所有其他代码Hibernate lazy fetch无法加载子对象,hibernate,spring-boot,lazy-loading,Hibernate,Spring Boot,Lazy Loading,我有很多子对象的父对象,所以不能使用。 我尝试了多种样式来获取父对象的所有子对象,但是 下面的代码,以及我尝试过的所有其他代码 failed to lazily initialize a collection of role xxxx, could not initialize proxy - no Session 如何初始化所有子对象?我真的需要对所有这些问题进行另一个查询吗。看起来有点愚蠢 @Transactional public List<XXX> find
failed to lazily initialize a collection of role xxxx, could not initialize proxy - no Session
如何初始化所有子对象?我真的需要对所有这些问题进行另一个查询吗。看起来有点愚蠢
@Transactional
public List<XXX> findYYYinXXX(Long id) {
List<XXX> list = xxxRepo.findYYY(id);
for (XXX p : list){
p.getChild().size();
}
return list;
}
@Transactional
公共列表findYYYinXXX(长id){
列表列表=xxxRepo.findYYY(id);
对于(XXX p:列表){
p、 getChild().size();
}
退货清单;
}
初始化(p.getChild);在for循环内部使用时,也会在父类use fetch type Eager中引发相同的错误 1) 使用即时获取类型 比如@OneToMany(fetch=fetchType.Eager) 2) 使用join-fetch查询 在创建查询时,使用fetchjoin 例如,
String hql=“从父类p join fetch p.child\u class\u实例中选择p;
顺便提一下:在本例中使用@ElementCollections至少需要使用@CollectionTable(name=“TABLENAME”,schema=“SCHEMANAME”)如果您使用的是
lazy=extra
则在调用size
或isEmpty
时代理集合不会初始化,请参见。
你可以得到第一个孩子,而不是叫“大小”
然而,您的问题没有意义,因为您希望立即获取,但您正在尝试强制加载子项。我认为您真正想要的是使此
findYYYinXXX
的客户端也成为事务的一部分,因此如果它需要加载子项,它将不会失败。如果您使用spring boot,您可以设置f在application.properties
文件中下载属性以保持延迟加载:
spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
我将尝试第二种方法,但问题从“我有很多子对象的父对象,所以不能使用”。“如果需要过滤输出,请尝试第二种方法,并在hql中应用where条件。表示找不到表。Join似乎使用camelcase表名tho。不确定为什么可以在DAO层而不是在服务中使用Hibernate.initialize,以便仍然打开会话并将其放入application.properties和databaseConfig类中,两者似乎都没有任何影响。仍然无法加载子对象