2013-09-06 4 views
9

Пример файла конфигурации пружины:поставщик JPA против диалекте против поставщика в конфигурации Spring contaniner

<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 раза. В транзакции менеджер боба, менеджер сущности фабрики бобе и в конфигурации устройства настойчивости:

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

Мне это непонятно. Пожалуйста, объясни.

ответ

11

Постараюсь объяснить вам построчно:

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

//Should ideally be 
<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/> 
  • Этот компонент определяет jpaDialect, что вы собираетесь использовать. JpaDialect - это интерфейс, который инкапсулирует определенные функции, которые стандарт JPA 1.0 не предлагает, например, доступ к базовому соединению JDBC. Эта стратегия в основном предназначена для автономного использования провайдера JPA; большая часть его функций не имеет значения при работе с транзакциями JTA. Также позволяет предоставлять методы с добавленной стоимостью для переносимых, но более способных субинтерфейсов EntityManager и EntityManagerFactory, предлагаемых Spring.
  • Поскольку вы предоставили класс как class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>, это позволяет Spring подключить поведение конкретного производителя в EntityManagerFactory создатель Spring и он служит в качестве единой точки конфигурации для всех Vendor-Specific properties.It в пользовательской реализации ярового собственного JpaVendorAdapter.

Для второго боба, где вы заявили:

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory"ref="entityManagerFactory"/> 
    <property name="jpaDialect"ref="jpaDialect"/> 
</bean> 
  • Вы говорите «Весна», чтобы настроить transactionManager, свойства которых entityManagerFactory и 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> 

<provider> говорит весной использовать hibernate поставщик и класс org.hibernate.ejb.HibernatePersistence является Hibernate EJB3 реализации поставщика настойчивости.

Короче говоря, вам необходимо настроить их, чтобы сообщить весне, какие функции ORM следует использовать.

Причина, по которой ваше приложение работало с настройкой только настойчивость и поставщика в том, что адаптер поставщика автоматически передается живучесть при условии, т.е. HibernatePersistence через getPersistenceProvider в JpaVendorAdapter.

Погрузите документацию, чтобы понять, как эти классы взаимосвязаны.

EDIT: Как отметил @TheKojuEffect, первый боб идеале должен быть в форме:

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

Спасибо. Пропустил vendorAdapter.

Вы можете обратиться:

Надеется, что это помогает. :)

+0

Хорошее объяснение, но я думаю, что вы допустили ошибку в своем ответе. В первом компоненте 'jpaDialect', я думаю, вы имели в виду' jpaVendorAdapter'. Было бы лучше, если вы исправите свой ответ. – TheKojuEffect

+0

Спасибо за ответ. Я просмотрел HibernateJpaVendorAdapter и нашел методы getJpaDialect() и getPersistenceProvider(). Я думаю, было бы правильно настроить фабрику управления сущностями только с HibernateJpaVendorAdapter. И этого будет достаточно, так как диалект jpa и jpa-провайдер могут быть получены из класса адаптера. – Alexandr

Смежные вопросы