Vaadin Spring и Hibernate: не удалось инициализировать прокси - нет сеанса - PullRequest
0 голосов
/ 24 февраля 2020

Модель:

    @Entity
    ...
    public class ScolProgressionPopulation {    
       ...        
        @OneToMany(mappedBy = "population")
        private List<ScolProgressionSemestre> progressions;        
       ...
    }

Репозиторий:

    public interface ScolProgressionPopulationRepository extends JpaRepository<ScolProgressionPopulation, Long>

Вид:

    @Route(value = "progression", layout = ApplicationLayout.class)
    @RouteAlias(value = "", layout = ApplicationLayout.class)
    public class ProgressionView extends Div {
           public ProgressionView(@Autowired ScolProgressionPopulationRepository scolProgressionPopulationRepository) {
               var items = scolProgressionPopulationRepository.findAll();

               // I try this..
               Hibernate.initialize(items);
               // and this ...
               Hibernate.initialize(items.get(0));

               // this works:
               System.out.println("this is ok:" +items.size());

               // but not this:
               System.out.println("err, could not initialize proxy - no Session :" +items.get(0).getProgressions().size());

Я стараюсь много вещей, чтобы заставить ленивую загрузку работать, ( добавление @Transactional, Hibernate.initialize ...)

Но я всегда сталкиваюсь с этой ошибкой:

org.springframework.beans.factory.BeanCreationException: Ошибка при создании компонента с именем 'n c .un c .scolarite.lmd.progression. gui .ProgressionView': не удалось создать экземпляр компонента с помощью конструктора; вложенным исключением является org.springframework.beans.BeanInstantiationException: не удалось создать экземпляр [n c .un c .scolarite.lmd.progression. gui .ProgressionView]: конструктор вызвал исключение; Вложенное исключение - org.hibernate.LazyInitializationException: не удалось лениво инициализировать коллекцию ролей: n c .un c .scolarite.lmd.progression.entities.ScolProgressionPopulation.progressions, не удалось инициализировать прокси - нет Session

PS: я не хочу использовать EAGER fetch. Я хочу лениво загрузить данные.

1 Ответ

2 голосов
/ 24 февраля 2020

Вы можете создать новый метод в своем хранилище, который использует join fetch для извлечения связанных сущностей, например,

@Query("SELECT spp FROM ScolProgressionPopulation spp JOIN FETCH spp.progressions")
public List<ScolProgressionPopulation> findAllWithProgressions();

Другой способ - добавить аннотацию @Transactional к методу в вашем хранилище. (тогда это не может быть интерфейс), он также может работать с методом на ваш взгляд. Вам, вероятно, нужно вызвать initialize для всех коллекций прогрессии, что не очень эффективно, так как может создать много запросов к БД.

@Transactional
public List<ScrolProgressionPopulation> findAllWithProgressions() {
    val spps = findAll();
    for(ScrolProgressionPopulation spp: spps) {
        Hibernate.initialize(spp.getProgressions();
    }
    return spps;
}

Редактировать: Если вы не хотите инициализируйте все элементы, вы можете сделать что-то вроде этого

@Transactional
public void initializeProgressions(ScrolProgressionPopulation spp) {
    Hibernate.initialize(spp.getProgressions());
}

и вызывать это по требованию.

...