@Scheduled和@Transactional方法中的Spring-data-jpa延迟加载

时间:2018-08-31 12:03:51

标签: java hibernate spring-boot spring-data-jpa

在我的Configuration类中,我需要将一个方法作为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的{​​{1}},为什么我会得到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

getIndices():

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

getThemeIndexes():

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

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

1 个答案:

答案 0 :(得分:1)

您正在本地调用getServices(),因此本地方法调用没有事务代理。

您应该将计划的方法移到其自己的组件中,并使用getServices()方法注入该组件。