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

时间:2013-09-06 03:51:21

标签: java spring hibernate jpa configuration

弹簧配置文件示例:

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

我不清楚。请解释一下。

1 个答案:

答案 0 :(得分:11)

会尝试逐行解释:

<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 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>
  • 你告诉&#39;春天&#39;配置属性为transactionManagerentityManagerFactory的{​​{1}}。由于这些属性必须特定于jpaDialect,因此根据这些属性进行设置。 hibernateentityManagerFactory现已专门设置为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> 告诉spring使用<provider>提供程序,类hibernate是Hibernate EJB3持久性提供程序实现。

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

您的应用程序仅配置持久性和提供程序的原因是因为供应商适配器通过org.hibernate.ejb.HibernatePersistence中的HibernatePersistence自动传递了getPersistenceProvider提供的持久性。

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

编辑:正如@TheKojuEffect指出的那样,第一个bean理想情况应该是:

JpaVendorAdapter

感谢。错过了<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/>

您可以参考:

希望它有所帮助。 :)