在我的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);
}
答案 0 :(得分:1)
您正在本地调用getServices(),因此本地方法调用没有事务代理。
您应该将计划的方法移到其自己的组件中,并使用getServices()方法注入该组件。