JPA provider vs. dialect vs. vendor in the Spring contaniner configuration

16,703

Will try to explain it to you line by line:

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

//Should ideally be 
<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/>
  • This bean defines the jpaDialect that you are going to use. JpaDialect is an interface encapsulates certain functionality that standard JPA 1.0 does not offer, such as access to the underlying JDBC Connection. This strategy is mainly intended for standalone usage of a JPA provider; most of its functionality is not relevant when running with JTA transactions. Also allows for the provision of value-added methods for portable yet more capable EntityManager and EntityManagerFactory subinterfaces offered by Spring.
  • Since you have provided the class as class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>, this allows Spring to plug in vendor-specific behavior into Spring's EntityManagerFactory creators and it serves as single configuration point for all vendor-specific properties.It's a custom implementation of spring's own JpaVendorAdapter.

For the second bean where you have declared:

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory"ref="entityManagerFactory"/>
    <property name="jpaDialect"ref="jpaDialect"/>
</bean>
  • You tell 'Spring' to configure a transactionManager whose properties are entityManagerFactory and jpaDialect. Since these properties have to specific to hibernate these are set according. The entityManagerFactory and jpaDialect are now set specifically to hibernate (or Vendor).

As for the third bean

<property name="jpaDialect"ref="jpaDialect"/>
...
<property name="jpaVendorAdapter">
    <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
</property>
...
<provider>org.hibernate.ejb.HibernatePersistence</provider>

The <provider> tells spring to use the hibernate provider and the class org.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 the getPersistenceProvider in JpaVendorAdapter.

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 :

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

Thanks. Missed the vendorAdapter.

You can refer :

Hope it helps. :)

Share:
16,703

Related videos on Youtube

Alexandr
Author by

Alexandr

Updated on October 02, 2022

Comments

  • Alexandr
    Alexandr over 1 year

    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.

  • TheKojuEffect
    TheKojuEffect over 10 years
    Nice explanation but I think you've done mistake in your answer. In first bean jpaDialect, I think you meant jpaVendorAdapter. It would be better if you correct your answer.
  • Alexandr
    Alexandr over 10 years
    Thanks for the reply. I've looked through the HibernateJpaVendorAdapter and found getJpaDialect() and getPersistenceProvider() methods. I think it would be correct to configure entity manager factory with HibernateJpaVendorAdapter only. And it'll be enough cause both jpa dialect and jpa provider can be received from the adapter class.