弹簧配置文件示例:
<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。
我不清楚。请解释一下。
答案 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"/>
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>
transactionManager
和entityManagerFactory
的{{1}}。由于这些属性必须特定于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>
告诉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"/>
。
您可以参考:
希望它有所帮助。 :)