(基于注释和基于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注册到实际的线程本地数据中。问题是通过明确的程序解决方案获得这些数据的“美妙”方式。
答案 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的配置时,默认情况下启用此功能。