【发布时间】: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