gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:53:03 26 4
gpt4 key购买 nike

编辑:我已经更新了帖子以反射(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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com