Hibernate懒惰获取无法加载子对象

时间:2018-09-03 11:10:44

标签: hibernate spring-boot lazy-loading

我有很多子对象的父对象,所以不能使用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循环内使用也会引发相同的错误

3 个答案:

答案 0 :(得分:1)

如果您使用的是generalKnowledge,则在调用lazy=extrasize时不会初始化代理集合,请参见this answer。 您可以生第一个孩子,而不用打电话给孩子。

但是,您的问题没有道理,因为您想获取EAGER,但您正试图强制加载子项。我认为您真正想要的是也使该isEmpty的客户端也成为事务的一部分,因此,如果它需要加载子级,它将不会失败。

答案 1 :(得分:1)

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

spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true

答案 2 :(得分:0)

在父类中,使用访存类型为Eager。

1)使用预取类型。

就像@OneToMany(fetch = fetchType.Eager)

2)使用联接获取查询。

在创建查询时使用提取联接。

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

作为一个提示:在这种情况下,使用@ElementCollections至少需要使用@CollectionTable(name =“ TABLENAME”,schema =“ SCHEMANAME”)