如何使用spring注入JPA EntityManager

Posted

技术标签:

【中文标题】如何使用spring注入JPA EntityManager【英文标题】:How to inject JPA EntityManager using spring 【发布时间】:2011-01-26 03:40:37 【问题描述】:

是否可以让 Spring 将 JPA entityManager 对象注入我的 DAO 类而不扩展 JpaDaoSupport?如果是,Spring 是否在这种情况下管理事务?

我试图让我的 Spring 配置尽可能简单:

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="em"/>
</bean>
<bean id="em" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="myPU"/>
</bean>

【问题讨论】:

【参考方案1】:

是的,虽然它充满了陷阱,因为 JPA 有点奇怪。非常值得阅读有关注入 JPA EntityManagerEntityManagerFactory 的文档,而代码中没有明确的 Spring 依赖项:

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/orm.html#orm-jpa

这允许您注入EntityManagerFactory,或者直接注入EntityManager 的线程安全、事务代理。后者使代码更简单,但意味着需要更多的 Spring 管道。

【讨论】:

【参考方案2】:

是否可以让 spring 将 JPA entityManager 对象注入我的 DAO 类而不扩展 JpaDaoSupport?如果是,在这种情况下,spring 是否管理事务?

这是在12.6.3. Implementing DAOs based on plain JPA 中记录的黑底白字:

可以编写代码 不使用任何 Spring 的普通 JPA 依赖项,使用注入的 EntityManagerFactoryEntityManager。 注意Spring可以理解 @PersistenceUnit@PersistenceContext 两个注解 在字段和方法级别,如果 PersistenceAnnotationBeanPostProcessor 已启用。对应的 DAO 实现可能看起来像这样 (...)

关于事务管理,请看12.7. Transaction Management:

Spring JPA 允许已配置的 JpaTransactionManager 将 JPA 事务公开给访问相同 JDBC 数据源的 JDBC 访问代码,前提是已注册的 JpaDialect 支持检索底层 JDBC 连接。 Spring 开箱即用地为 Toplink、Hibernate 和 OpenJPA JPA 实现提供方言。有关JpaDialect 机制的详细信息,请参阅下一节。

【讨论】:

【参考方案3】:

最新的 Spring + JPA 版本从根本上解决了这个问题。 你可以在a separate thread了解更多如何一起使用 Spring 和 JPA

【讨论】:

以上是关于如何使用spring注入JPA EntityManager的主要内容,如果未能解决你的问题,请参考以下文章

Spring+JPA EntityManager 注入 service 和 dao

Spring JPA/Hibernate EmptyInterceptor 不注入 Entitymanager/Spring bean

将 Spring Boot 与 JPA 一起使用时如何持久化

Spring Boot + JPA 多模块项目无法注入 JpaRepository 接口

Spring data jpa-未定义名为“entityManagerFactory”的bean;注入自动装配的依赖项失败

Spring Data JPA 使用主从数据源