Spring @计划的+;冬眠->;懒散初始化异常

Spring @计划的+;冬眠->;懒散初始化异常,spring,hibernate,lazy-loading,scheduler,lazy-initialization,Spring,Hibernate,Lazy Loading,Scheduler,Lazy Initialization,我在SpringBoot2.0.5下,使用SpringDataJPA 我有这样一门课(为了理解): MyService类调用SpringJPA存储库来获取所有“测试”实例 “测试”实例具有延迟加载(MyLazyObject) 无论如何,如果我从我的控制器调用这个方法,一切都会很顺利 当它从调度程序运行时,出现以下错误: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of ro

我在SpringBoot2.0.5下,使用SpringDataJPA

我有这样一门课(为了理解):

MyService类调用SpringJPA存储库来获取所有“测试”实例

“测试”实例具有延迟加载(MyLazyObject)

无论如何,如果我从我的控制器调用这个方法,一切都会很顺利

当它从调度程序运行时,出现以下错误:

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.tinea.apix.service.model.entity.apim.APIManagerEntity.synchroHistory, could not initialize proxy - no Session

有什么想法吗?

由于使用了在配置时调用的
configureTasks
,所以很早就创建了
Syncronizer
。如此之早,它不再有资格进行代理创建/后期处理。这反过来导致(至少是任务)使用未经验证的实例,而不应用
@Transactional

相反,您应该使用
@Scheduled
注释和
cronString
属性,以与现在相同的方式解析它

@Scheduled(cron="@appConfigProperties.cronExpression")
SpEL表达式中的
@
符号表示应解析具有给定名称的bean

@Scheduled(cron = "0 30 17 * * ?")

另一方面,我们也可以这样使用

这是由于您正在使用的构造,导致将
同步器
(或至少是任务使用的同步器)创建为非代理实例。在您的事务方法上使用
@Scheduled
,而不是您现在拥有的。您是对的,如果我使用@Scheduled(cron=…),它就可以工作。您能详细说明原因吗?因为,如上所述,您当前的设置导致迫切需要创建
同步器
,从而使其不符合代理资格,从而使
@事务性
无效。
@预定的
延迟了。我知道了,谢谢,我去看看机械师。你介意给出一个我认为正确的答案吗?@Scheduled(cron=“#{@appConfigProperties.cronExpression}”)
@Scheduled(cron="@appConfigProperties.cronExpression")
@Scheduled(cron = "0 30 17 * * ?")