2010-03-10 267 views
36

我有几个关于在Tomcat上运行的JPA + Spring集成的问题。我一直在寻找一些时间,一直没有找到具体的答案,所以这里有:如何使用spring注入JPA EntityManager

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

编辑:这是非常有益的,谢谢大家!

回答

29

是的,虽然它充满了疑难杂症,但由于JPA有点奇怪。这是非常值得一读的注入JPA EntityManagerEntityManagerFactory的文档,而无需在代码中明确Spring的依赖:

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

这可以让你无论是注入EntityManagerFactory,否则注入线程安全的,事务代理的直接EntityManager。后者使代码更简单,但意味着需要更多的Spring管道。

12

是否有可能有弹簧注入JPA entityManager对象到我的DAO类中,但没有扩展JpaDaoSupport?如果是的话,春天是否在这种情况下管理交易?

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

,能够编写针对 平原JPA码而不使用任何弹簧 依赖关系,使用一个注入 EntityManagerFactoryEntityManager。 注意Spring能够识别字段或者方法级别 @PersistenceUnit@PersistenceContext注释都 如果启用了 PersistenceAnnotationBeanPostProcessor 。一个相应的DAO实现 可能是这样的(...)

以及有关的事务管理,看看12.7. Transaction Management

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

3

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