2015-05-08 125 views
1

編輯:我已經更新了文章,以反映在下面的意見的問題,但總的來說,所有的人都這樣做,但問題仍然存在如何將EntityManager注入Spring Integration bean?

我試圖找到一種方式來注入春天-managed EntityManager加入到處理Spring Integration工作流數據庫更新部分的bean中。

由於某些原因,我在嘗試引用EM實例時不斷收到NullPointerException。

我的設置是如下:

@Component 
public class BranchDeploymentUpdater { 
    @PersistenceContext(unitName = "MyPU") 
    private EntityManager em; 

    public File handleUpdate(File input) { 
     ..... 
     String query = "some query"; 
     TypedQuery<MyClass> typedQuery = em.CreateQuery(query, MyClass.class); 
     ..... 
    } 
} 

我的persistence.xml已被配置如下:

<persistence-unit name="MyPU" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 

    <properties> 
     <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /> 
     <property name="javax.persistence.jdbc.url" value="jdbc:mysql://192.168.2.169:3306/MYDB" /> 
     <property name="javax.persistence.jdbc.user" value="user" /> 
     <property name="javax.persistence.jdbc.password" value="[email protected]" /> 

     <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" /> 
     <property name="hibernate.show_sql" value="true" /> 
     <property name="hibernate.format_sql" value="true" /> 
     <!-- Connection Pooling --> 
     <property name="hibernate.connection.provider_class" 
       value="org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider" /> 
     <property name="hibernate.c3p0.max_size" value="100" /> 
     <property name="hibernate.c3p0.min_size" value="5" /> 
     <property name="hibernate.c3p0.acquire_increment" value="5" /> 
     <property name="hibernate.c3p0.idle_test_period" value="500" /> 
     <property name="hibernate.c3p0.max_statements" value="50" /> 
     <property name="hibernate.c3p0.timeout" value="10000" /> 
    </properties> 

</persistence-unit> 

我的部件掃描在springapp-servlet.xml中文件聲明如下和使用EM的類別被確認爲在聲明的包裝中:

<context:component-scan base-package="com.myapp.webapp.controller, com.myapp.integration" /> 

NPE會發生在em.CreateQuery聲明。

在這個相同的項目中,我也有一個MVC webapp,我正在使用完全相同的方式將EM注入到控制器類中,並且它可以工作。

任何人都可以指出我可能會得到它錯誤的地方嗎?

目前,我正在通過實例化一個新的EM每當bean被調用,但如果我在太多的交易泵浦導致一個脫離連接錯誤。

請注意,我沒有使用Spring Integration的數據庫適配器,因爲我已經有處理數據庫層的JPA代碼並想保留該圖層。

感謝 黃

+0

如何在persistence.xml中定義持久性單元?也許持久性單元名稱不匹配。 –

+0

BranchDeploymentUpdater所在的軟件包是否由組件掃描覆蓋? – shazin

+0

我希望BranchDeploymentUpdater是一個Spring bean,因爲在上面的代碼片段中沒有任何@Component註釋或類似的東西。 –

回答

0

感謝所有的意見。我能夠最終得到它的工作通過注入EntityManagerFactory的替代,按照http://docs.spring.io/spring/docs/2.5.x/reference/orm.html#orm-jpa-tx

提供我認爲我以前忽略了一個關鍵的例子是線路:

<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/> 

這確實需要一個因爲我在數據庫中遇到競爭條件的時候,我正在爲自己的EM做實例化。