Ленивая загрузка Spring-data-jpa в методах @Scheduled и @Transactional - PullRequest
0 голосов
/ 31 августа 2018

В моем классе конфигурации мне нужно запустить метод как cronjob. Поэтому я создал метод, используя аннотацию @Scheduled.

@Scheduled(initialDelay = 10 * 1000, fixedRate = 1000 * 1000)
public void ThemeUpdate() {
    List<ThemeIndex> indices = getServices();
    ...
}

Метод ThemeUpdate() теперь выполняется в своем собственном потоке, и я потеряю свою транзакцию. Поэтому я создал другой метод, используя аннотацию @Transactional.

@Transactional
public List<ThemeIndex> getServices() {
    List<Service> services = serviceRepository.findServices();

    Section section = services.get(0).getSections().iterator().next();

    return null;
}

Я получаю List<Service> services от моего serviceRepository. Но если я хочу получить доступ к Section, который Entity извлекается при ленивой загрузке, почему я получаю LazyInitializationException?

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.example.myPorject.db.model.Service.sections, could not initialize proxy - no Session

Что мне здесь не хватает?

EDIT:

Запланировано:

@Scheduled(initialDelay = 10 * 1000, fixedRate = 10000 * 1000)
@Transactional
public void ThemeUpdate() {
    List<ThemeIndex> indices = themeUpdateServiceImpl.getIndices();
}

getIndices ():

@Override
public List<ThemeIndex> getIndices() {
    return getIndices(serviceRepository
        .findServices());
}

@Override
public List<ThemeIndex> getIndices(List<Service> services) {
    return themeIndexServiceImpl.getThemeIndexes(services);
}

getThemeIndexes ():

@Override
public List<ThemeIndex> getThemeIndexes(List<Service> services) {
    List<ThemeIndex> themeIndexs = new ArrayList<>();
    for (Service s : services) {
        ThemeIndex themeIndex = getThemeIndex(s);
        if (themeIndex != null) {
            themeIndexs.add(themeIndex);
        }
    }
    return themeIndexs;
}

@Override
public ThemeIndex getThemeIndex(Service service) {
    //SQL which is slow
    if (serviceRepository.isEpisService(service.getSvno())) {
        ...
    }

1 Ответ

0 голосов
/ 31 августа 2018

Вы локально вызываете getServices (), поэтому для локального вызова метода нет прокси транзакции.

Вам следует переместить запланированный метод в его собственный компонент и добавить компонент с помощью метода getServices ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...