Java 调用@Transactional带注释的方法时,如何以编程方式提供特定的事务管理器

Java 调用@Transactional带注释的方法时,如何以编程方式提供特定的事务管理器,java,spring,spring-transactions,Java,Spring,Spring Transactions,在我的测试中,我手动实例化了一个在生产中@Autowired的类。我用@Autowired依赖项手工注入它。在这个类上,我调用了一个用@Transactional注释的方法,下游使用@PersistenceContext注释的EntityManager。我得到的错误是 作用域中没有事务方面管理的TransactionStatus 我希望能够以编程方式提供一个EntityManager实例供上下文使用,但不知道如何做到这一点。请告知。另外,如果你需要更多的背景资料,请告诉我 我正在从Executo

在我的测试中,我手动实例化了一个在生产中@Autowired的类。我用@Autowired依赖项手工注入它。在这个类上,我调用了一个用@Transactional注释的方法,下游使用@PersistenceContext注释的EntityManager。我得到的错误是

作用域中没有事务方面管理的TransactionStatus

我希望能够以编程方式提供一个EntityManager实例供上下文使用,但不知道如何做到这一点。请告知。另外,如果你需要更多的背景资料,请告诉我

我正在从ExecutorService运行的可调用的测试中调用这个@Transactional带注释的方法,因此它无法访问ThreadLocal

Java 7和Spring 4.1.1

假设您使用@Transactional,您可以使用@Transactionalvalue=myTransactionManager


你是否在你的班级里@Autowired了EntityManager?你能提供类码吗?

只需通过@Autowired获取一个可工作的EM,并在需要的地方进行设置。还要检查您的测试是否标记为@Transactional。

我不能,因为我从ExecutorService调用了@Transactional注释方法。因此ThreadLocal不可用,这就是为什么我要求一个编程解决方案。您的问题是您创建的服务没有代理,因为它不是由spring注入的。如果你让Spring在你的测试中注入它,你就很好了。这与ExecutorService无关,因为如果您在那里使用代理bean,它当然会根据传播创建一个新会话/tx。我已经让Spring注入了它,但不幸的是仍然存在同样的问题。让我再次强调,该方法是从另一个方向调用的我在测试中通过ExecutorService运行的可调用函数调用这个@Transactional带注释的方法,因此它无法访问ThreadLocal。您始终可以访问ThreadLocal,您只需要自己定义它。但是,ThreadLocal与您的问题完全无关。我从运行测试的线程以外的线程调用上述方法。是的,从技术上讲,我可以访问ThreadLocal,但它不包含事务上下文。