Spring contaniner配置中的JPA提供商与方言与供应商的对比

Ale*_*ndr 11 java configuration spring hibernate jpa

弹簧配置文件的示例:

<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>
Run Code Online (Sandbox Code Playgroud)

和persistence.xml jpa文件:

<persistence-unit name="EmployeeService">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
</persistence-unit>
Run Code Online (Sandbox Code Playgroud)

如您所见,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>
Run Code Online (Sandbox Code Playgroud)

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

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

这对我来说并不清楚.请解释.

use*_*071 12

将尝试逐行向您解释:

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

//Should ideally be 
<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/>
Run Code Online (Sandbox Code Playgroud)
  • 这个bean定义了你要使用的jpaDialect.JpaDialect是一个接口,它封装了标准JPA 1.0不提供的某些功能,例如访问底层JDBC Connection.此策略主要用于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>
Run Code Online (Sandbox Code Playgroud)
  • 你告诉'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>
Run Code Online (Sandbox Code Playgroud)

<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"/>
Run Code Online (Sandbox Code Playgroud)

谢谢.错过了vendorAdapter.

你可以参考:

希望能帮助到你.:)