以编程方式获取OpenEntityManagerInViewFilter创建的EntityManager

时间:2014-10-06 13:31:34

标签: spring jpa entity servlet-filters interceptor

(基于注释和基于aop的解决方案满足This question,这与我的情况完全相反。请不要将其标记为重复。)

我使用命名的Servlet过滤器为每个请求获取不同的线程本地EntityManager。

我想获得属于实际Servlet请求(线程)的EntityManager。

我想要一个简单的程序解决方案。使用spring aop注释我的一些课程没有播放,这正是我想要避免的。


P.S。在spring source code中挖掘一下,我可以在spring-orm/src/main/java/org/springframework/orm/jpa/support/OpenEntityManagerInViewFilter.java中找到以下代码,它创建了EntityManager并将其注册到实际的Request中:

EntityManager em = createEntityManager(emf);
EntityManagerHolder emHolder = new EntityManagerHolder(em);
TransactionSynchronizationManager.bindResource(emf, emHolder);

AsyncRequestInterceptor interceptor = new AsyncRequestInterceptor(emf, emHolder);
asyncManager.registerCallableInterceptor(key, interceptor);
asyncManager.registerDeferredResultInterceptor(key, interceptor);

正如我所看到的,这段代码以某种方式将新创建的EntityManager注册到实际的线程本地数据中。问题是通过明确的程序解决方案获得这些数据的“美妙”方式。

1 个答案:

答案 0 :(得分:1)

您的班级中不需要与EntityManager相关的任何与Spring相关或AOP相关的内容。只需输入EntityManager类型的字段并将默认@PersistenceContext(来自JPA)放在其上,然后注入右EntityManager。没有AOP相关。

public class MyDao {

    @PersistenceContext
    private EntityManager em;

}

如果您还有OpenEntityManagerInViewFilter将创建EntityManager并将其绑定到当前正在执行的线程。然后将其注入该字段(实际上它是委托调用的代理)。

假设您的配置中有<context:annotation-config /><context:component-scan />@PersistenceContext应该有效。使用基于Java的配置时,默认情况下启用此功能。