一尘不染

Spring容器配置中的JPA提供程序与方言与供应商

hibernate

弹簧配置文件示例:

<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。

我不清楚。请解释。


阅读 372

收藏
2020-06-20

共1个答案

一尘不染

将尝试逐行向您解释:

<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子接口提供增值方法。
  • 由于您已经提供了类as 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其属性为entityManagerFactory和的jpaDialect。由于这些属性必须特定于hibernate这些设置。的entityManagerFactoryjpaDialect现在被特别设置为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.HibernatePersistence是Hibernate的EJB3持久性提供者实现。

简而言之,您需要配置它们以告知spring应该使用哪个ORM功能。

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

仔细阅读文档,以了解这些类如何相互链接。

编辑 :如@TheKojuEffect所指出的,理想情况下,第一个bean的形式应为:

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

谢谢。错过了vendorAdapter

您可以参考:

希望能帮助到你。:)

2020-06-20