2014-10-06 63 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

相關問題