Hibernate lazy fetch 无法加载子对象

Hibernate lazy fetch unable to load child objects

我的父对象有很多子对象,所以不能使用 EAGER。 我尝试了多种样式来获取父对象的所有子对象,但是 下面的尺寸代码,以及我试过的其他所有东西都会抛出

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;
    }

Hibernate.initialize(p.getChild);在 for 循环中使用也会抛出相同的错误

在你的父 class 中使用获取类型 Eager。

1) 使用预取类型。

喜欢@OneToMany(fetch = fetchType.Eager)

2) 使用 join fetch 查询。

创建查询时使用 fetch join。

例如。 String hql = "select p from ParentClass p join fetch p.child_class_instance;

附带一提:在这种情况下使用@ElementCollections 至少需要使用@CollectionTable(name="TABLENAME", schema = "SCHEMANAME")

如果您正在使用 lazy=extra,则代理集合在调用 sizeisEmpty 时不会初始化,请参阅 this answer。 您可以获得第一个 child 而不是调用 size.

但是你的问题没有意义,因为你想要 EAGER 获取但你试图强制 child 加载。我认为你真正想要的是让这个 findYYYinXXX 的客户端也成为事务的一部分,所以如果它需要加载 childs 它不会失败。

如果您正在使用 spring-boot,您可以在 application.properties 文件中设置以下 属性 以保持延迟加载:

spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true