Example of spring configuration file:
<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>
and the persistence.xml jpa file:
<persistence-unit name="EmployeeService">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
</persistence-unit>
As you can see the jpa provider-related information is set 3 times. In transaction manager bean, entity manager factory bean and in the persistence unit configuration:
<property name="jpaDialect"ref="jpaDialect"/>
...
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
</property>
...
<provider>org.hibernate.ejb.HibernatePersistence</provider>
But actually in my project I configured only the persistence unit with provider. And it worked.
So my question is what's the difference between provider, dialect and vendor options? Must I set all of them or, I can skip some of them? Can I set, for example as a vendor for EntityMangerFactory - Hibernate, as a dialect in transaction manager - Eclipse and as a provider in the persistence unit configuration - something else, TopLink, for example.
It's no clear to me. Please explain.
Will try to explain it to you line by line:
class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
, this allowsSpring
to plug in vendor-specific behavior into Spring'sEntityManagerFactory
creators and it serves as single configuration point for all vendor-specific properties.It's a custom implementation of spring's ownJpaVendorAdapter
.For the second bean where you have declared:
transactionManager
whose properties areentityManagerFactory
andjpaDialect
. Since these properties have to specific tohibernate
these are set according. TheentityManagerFactory
andjpaDialect
are now set specifically tohibernate
(or Vendor).As for the third bean
The
<provider>
tells spring to use thehibernate
provider and the classorg.hibernate.ejb.HibernatePersistence
is Hibernate EJB3 persistence provider implementation.In short, you need to configure these in order to tell spring which ORM's functionality should be used.
The reason that your application worked with configuring just persistence and provider is because the vendor adapter is automatically passed the persistence provided i.e.
HibernatePersistence
via thegetPersistenceProvider
inJpaVendorAdapter
.Tinker around the documentation to understand how these classes are interlinked.
EDIT : As pointed out by @TheKojuEffect , the first bean should ideally be in the form of :
Thanks. Missed the
vendorAdapter
.You can refer :
Hope it helps. :)