使用ThreadLocals保留Spring的事务上下文。这意味着您的SessionFactory仅可用于调度您的请求的线程,因此,如果创建一个新线程,您将获得
null和相应的异常。
您的
@Async方法所做的是使用TaskExecutor在另一个线程中运行您的方法。因此,您的服务正在发生上述问题。
我引用了Spring的JpaTransactionManager文档:
单个JPA EntityManagerFactory的PlatformTransactionManager实现。 将JPA
EntityManager从指定的工厂绑定到线程
,可能允许每个工厂一个线程绑定的EntityManager。SharedEntityManagerCreator和@PersistenceContext知道线程绑定的实体管理器,并自动参与此类事务。支持该事务管理机制的JPA访问代码需要使用其中一种。
如果要保留注释,则应查看Hibernate
CurrentSessionContext并以某种方式自行管理会话。



