如何使用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 EntityManager
和 EntityManagerFactory
的文档,而代码中没有明确的 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 依赖项,使用注入的
EntityManagerFactory
或EntityManager
。 注意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;注入自动装配的依赖项失败