Спящий ленивый выбор не может загрузить дочерние объекты - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть родительский объект с множеством дочерних объектов, поэтому я не могу использовать 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 голосов
/ 03 сентября 2018

Если вы используете lazy=extra, коллекция прокси не инициализируется при вызове size или isEmpty См. этот ответ . Вы можете получить первого ребенка вместо того, чтобы называть размер.

Однако ваш вопрос не имеет смысла, потому что вы хотите получить EAGER, но вы пытаетесь заставить дочернюю загрузку. Я думаю, что вы действительно хотите, чтобы клиент этой findYYYinXXX также был частью транзакции, поэтому, если ему нужно загрузить дочерние элементы, он не потерпит неудачу.

0 голосов
/ 03 сентября 2018

если вы используете весеннюю загрузку, вы можете установить следующее свойство в вашем application.properties файле, чтобы сохранить ленивую загрузку:

spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
0 голосов
/ 03 сентября 2018

В родительском классе используйте тип извлечения Eager.

1) использовать тип извлечения.

как @OneToMany (fetch = fetchType.Eager)

2) использовать запрос на получение соединения.

При создании запроса используйте fetch join.

например. String hql = "select p from ParentClass p join fetch p.child_class_instance;

В КАЧЕСТВЕ ПОБОЧНОГО СОБЫТИЯ: использование @ElementCollections в этом случае как минимум требует использования @CollectionTable (name = "TABLENAME", schema = "SCHEMANAME")

...