11

spring配置文件示例:

<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory"ref="entityManagerFactory"/>
    <property name="jpaDialect"ref="jpaDialect"/>
</bean>

<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
    </property>
....
</bean>

和 persistence.xml jpa 文件:

<persistence-unit name="EmployeeService">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
</persistence-unit>

如您所见,jpa 提供程序相关信息设置了 3 次。在事务管理器 bean、实体管理器工厂 bean 和持久性单元配置中:

<property name="jpaDialect"ref="jpaDialect"/>
...
<property name="jpaVendorAdapter">
    <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
</property>
...
<provider>org.hibernate.ejb.HibernatePersistence</provider>

但实际上在我的项目中,我只配置了带有提供程序的持久性单元。它奏效了。

所以我的问题是提供者、方言和供应商选项之间有什么区别?我必须设置所有这些,还是可以跳过其中一些?例如,我可以设置为 EntityMangerFactory - Hibernate 的供应商,作为事务管理器中的方言 - Eclipse 和持久性单元配置中的提供者 - 其他东西,例如 TopLink。

我不清楚。请解释。

4

1 回答 1

13

将尝试逐行向您解释:

<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>

//Should ideally be 
<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/>
  • 这个 bean 定义了您将要使用的 jpaDialect。JpaDialect 是一个接口,它封装了标准 JPA 1.0 不提供的某些功能,例如对底层 JDBC 连接的访问​​。此策略主要用于 JPA 提供程序的独立使用;当使用 JTA 事务运行时,它的大部分功能都无关紧要。还允许为 Spring 提供的可移植但功能更强大的 EntityManager 和 EntityManagerFactory 子接口提供增值方法。
  • 由于您已将类提供为class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>,因此这允许Spring将特定于供应商的行为插入 Spring 的EntityManagerFactory创建者中,并且它用作所有特定于供应商的属性的单个配置点。它是 spring 自己的自定义实现JpaVendorAdapter

对于您声明的第二个 bean:

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory"ref="entityManagerFactory"/>
    <property name="jpaDialect"ref="jpaDialect"/>
</bean>
  • 你告诉'Spring'配置一个transactionManager属性是entityManagerFactoryand的jpaDialect。由于这些属性必须要具体到hibernate这些是根据来设置的。和entityManagerFactory现在jpaDialect专门设置为hibernate(或供应商)。

至于第三颗豆

<property name="jpaDialect"ref="jpaDialect"/>
...
<property name="jpaVendorAdapter">
    <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
</property>
...
<provider>org.hibernate.ejb.HibernatePersistence</provider>

<provider>告诉 spring 使用hibernate提供程序,该类是org.hibernate.ejb.HibernatePersistenceHibernate EJB3 持久性提供程序实现。

简而言之,您需要配置这些,以便告诉 spring 应该使用哪个 ORM 的功能。

您的应用程序使用仅配置持久性和提供程序的原因是因为供应商适配器会自动传递提供的持久性,即HibernatePersistence通过getPersistenceProviderin JpaVendorAdapter

修补文档以了解这些类是如何相互关联的。

编辑:正如@TheKojuEffect 所指出的,理想情况下,第一个 bean 应该采用以下形式:

<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/>

谢谢。错过了vendorAdapter

你可以参考:

希望能帮助到你。:)

于 2013-09-06T05:45:17.440 回答