java - 如何将EntityManager注入(inject)到Spring Integration bean中?

标签 java spring hibernate jpa spring-integration

编辑:我已经更新了帖子以反射(reflect)下面评论中的问题,但总而言之,所有这些都已完成,但问题仍然存在

我正在尝试找到一种方法将 Spring 管理的 EntityManager 注入(inject)到我的 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 Web 应用程序,我使用完全相同的方式将 EM 注入(inject)到 Controller 类中,并且它可以工作。

有人可以指出我可能出错的地方吗?

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

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

谢谢 黄

最佳答案

感谢大家的评论。按照 http://docs.spring.io/spring/docs/2.5.x/reference/orm.html#orm-jpa-tx 中提供的示例,我终于能够通过注入(inject) EntityManagerFactory 来使其工作。

我认为我之前遗漏的一件关键事情是:

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

这确实让我心烦意乱,因为我在数据库中实例化我自己的 EM 时遇到了竞争条件,度过了一段非常愉快的时光。

关于java - 如何将EntityManager注入(inject)到Spring Integration bean中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30114691/

相关文章:

java - 如何在 IDEA 中构建 .war 文件以部署到 Liferay?

java - Spring Boot OAuth2 具有基本身份验证和自定义 UserDetailsS​​ervice

java - 取消注册 c2dm

java - 带有Eureka依赖的Spring启动无法启动

Java readObject/writeObject 可以保存/加载父类(super class),那为什么需要read/writeExternal?

java - 配置ldap以授权用户

java - 为什么 Spring Around 建议可以吞下或停止传播目标方法抛出的异常?

java - org.apache.struts2.json.JSONException : org. hibernate.LazyInitializationException:未能延迟初始化集合

java - 一对多关联 "org.hibernate.InvalidMappingException: Could not parse mapping document from input stream"

java - @Temporal(TemporalType.DATE) 与 Oracle 12