如何将EntityManager注入Spring Integration bean?

时间:2015-05-08 02:10:10

标签: java spring hibernate jpa spring-integration

编辑:我已更新帖子以反映以下评论中的问题,但总的来说,所有这些问题都已完成,但问题仍然存在

我试图找到一种方法将Spring管理的EntityManager注入到我的bean中,该bean处理Spring Integration工作流的数据库更新部分。

由于某种原因,我在尝试引用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="P@ssw0rd" />

        <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注入控制器类并且它可以工作。

任何人都可以指出我可能错误的地方吗?

目前,我通过在每次调用bean时实例化一个新的EM来解决这个问题,但是如果我抽入了太多的事务,这会导致MySQL出现连接失误。

请注意,我没有使用Spring Integration的数据库适配器,因为我已经有了处理数据库层的JPA代码,并希望保留该层。

由于 黄

1 个答案:

答案 0 :(得分:0)

感谢所有评论。我按照http://docs.spring.io/spring/docs/2.5.x/reference/orm.html#orm-jpa-tx

中提供的示例,通过注入EntityManagerFactory最终使其工作

我认为我之前遗漏的一个关键因素是:

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

这真的让我很担心,因为我在数据库实例化我自己的EM时遇到了竞争条件的helluva时间。