【发布时间】:2014-10-06 13:31:34
【问题描述】:
(This question 对基于注释和 aop 的解决方案感到满意,这与我的情况正好相反。请不要将其签名为重复。)
我使用命名的 Servlet 过滤器为每个请求获取不同的线程本地 EntityManager。
我想获取属于实际 Servlet 请求(线程)的 EntityManager。
我想要一个简单的程序解决方案。用 spring aop 注释我的一些类不起作用,这正是我想要避免的。
附:深入研究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 注册到实际的线程本地数据中。这个问题是通过明确的程序解决方案获取这些数据的“美丽”方式。
【问题讨论】:
标签: spring jpa entity servlet-filters interceptor