2014-10-06 25 views
0

This question通过注解& AOP纳 - 基础的解决方案,这是完全相反的是我的情况请不要签收,作为重复。)获取的EntityManager由OpenEntityManagerInViewFilter创建编程

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

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

我想要一个简单的程序解决方案。用spring aop注解我的一些类并不会起作用,这正是我想要避免的。


P.挖一点点进入spring source code,我可以在spring-orm/src/main/java/org/springframework/orm/jpa/support/OpenEntityManagerInViewFilter.java找到下面的代码,创建并EntityManager的,并在实际申请注册吧:

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

你不需要任何东西春季相关或AOP在你的课堂上想要一个EntityManager相关。只需放入EntityManager类型的字段,并将默认的@PersistenceContext(来自JPA)放在其上,并且将注入右边的EntityManager。没有AOP相关。

public class MyDao { 

    @PersistenceContext 
    private EntityManager em; 

} 

如果你也有OpenEntityManagerInViewFilter这将创建一个EntityManager并将其绑定到当前执行的线程。然后这将被注入该字段(实际上,它是委托该代理的代理)。

假设您的<context:annotation-config /><context:component-scan />在您的配置中@PersistenceContext应该工作。当使用基于Java的配置时,默认启用。

+0

我有,它不工作,EntityManager保持空,独立我做了什么。最后,我删除了每个注释(即使是@Transactional注释),现在我正在以程序方式执行所有操作。这是该项目的重大重构。它会起作用。我知道。 – peterh 2014-10-08 11:50:30

+0

我怀疑你还有它会工作,你还没有发布你的配置,所以实际问题是什么(我怀疑配置错误)。因此,如果您仍然需要帮助,请添加您的配置(xml和可能的web.xml)。 – 2014-10-08 17:49:44

相关问题