如何使用spring注入JPA EntityManager

时间:2010-03-10 23:03:22

标签: java spring jpa

是否可以让 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>

3 个答案:

答案 0 :(得分:32)

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

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

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

答案 1 :(得分:12)

  

是否可以让spring将JPA entityManager对象注入我的DAO类whitout,扩展JpaDaoSupport?如果是的话,在这种情况下Spring会管理交易吗?

这在12.6.3. Implementing DAOs based on plain JPA中以白色记录为黑色:

  

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

关于交易管理,请查看12.7. Transaction Management

  

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

答案 2 :(得分:3)

最新的Spring + JPA版本从根本上解决了这个问题。 您可以在a separate thread

中了解有关如何使用Spring和JPA的更多信息