【问题标题】:How to inject JPA EntityManager using spring如何使用spring注入JPA EntityManager
【发布时间】: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>

【问题讨论】:

    标签: java spring jpa


    【解决方案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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-05-02
          • 2015-08-11
          • 2017-04-07
          • 2015-08-25
          • 2014-10-06
          • 2016-08-06
          • 1970-01-01
          • 2015-05-03
          相关资源
          最近更新 更多