【问题标题】:How to inject EntityManager into Spring Integration bean?如何将 EntityManager 注入 Spring Integration bean?
【发布时间】:2015-05-08 02:10:09
【问题描述】:

编辑:我已经更新了帖子以反映下面 cmets 中的问题,但总的来说,所有问题都已完成,但问题仍然存在

我正在尝试找到一种方法将 Spring 管理的 EntityManager 注入到我的 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.CreateQuerystatement。

在同一个项目中,我还有一个 MVC webapp,我使用完全相同的方式将 EM 注入到控制器类中,并且它可以工作。

任何人都可以指出我可能在哪里弄错了吗?

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

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

谢谢 黄

【问题讨论】:

  • 如何在persistence.xml 中定义持久化单元?可能持久化单元名称不匹配。
  • BranchDeploymentUpdater所在的包是否被组件扫描覆盖?
  • 我希望 BranchDeploymentUpdater 是一个 Spring bean,因为上面的 sn-p 没有任何 @Component 注释或类似的东西。
  • BranchDeploymentUpdater 注册为 Spring bean 的上下文中,您是否已将 PersistenceAnnotationBeanPostProcessor 注册为 bean?否则,Spring 无法识别注解 PersistenceContext
  • @dunni 不,我没有注册。但是,我的理解是,只要我将它包含在我的基本组件扫描中,它就会被暗示(参考:stackoverflow.com/questions/12471019/…

标签: java spring hibernate jpa spring-integration


【解决方案1】:

感谢所有 cmets。按照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 的数据库中遇到竞争条件时,这真的让我很头疼。

【讨论】:

    猜你喜欢
    • 2014-10-06
    • 2013-06-25
    • 2011-11-05
    • 2019-02-03
    • 2011-01-26
    • 2011-02-05
    • 2017-10-23
    • 2012-02-19
    • 2011-05-29
    相关资源
    最近更新 更多