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类中,两者似乎都没有任何影响。仍然无法加载子对象