Подтвердить что ты не робот

Почему мне нужно определить адаптер поставщика Hibernate-JPA в моем приложении Spring?

Я потратил дни и дни, пытаясь получить рабочее соединение с базой данных для моих интеграционных тестов Spring/JPA (Hibernate), устранение таинственных ошибок "Отсутствие контекста базы данных", и я, наконец, получил его работу, но я не понять, почему я должен был делать то, что сделал.

Обратите внимание, как мой LocalContainerEntityManagerFacotryBean ссылается на HibernateJpaVendorAdapter.

applicationContext.xml

<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="myEMF">
    <property name="persistenceXmlLocation" value="file:src/test/resources/META-INF/persistence.xml" />
    <property name="persistenceUnitName" value="myPU" />
    <property name="jpaVendorAdapter" ref="hibernateJpaAdapter" />
</bean>

<bean id="hibernateJpaAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
    <property name="showSql" value="true" />
</bean>

Почему мне пришлось использовать этот HibernateJpaVendorAdapter, когда мой блок персистентности уже настроен для Hibernate, как показано ниже?

persistence.xml

<persistence-unit name="myPU" transaction-type="RESOURCE_LOCAL">
    <class>com.blah.blah.Class1</class>
    <class>com.blah.blah.Class2</class>
    <class>com.blah.blah.Class3</class> 
    <properties>
        <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
        <property name="hibernate.connection.url" value="jdbc:mysql://127.0.0.1?zeroDateTimeBehavior=convertToNull"/>
        <property name="hibernate.connection.username" value="uname"/>
        <property name="hibernate.connection.password" value="pwd"/>
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect" />

        <property name="hibernate.hbm2ddl.auto" value="update" />
        <property name="hibernate.show_sql" value="true" />
        <property name="hibernate.ejb.event.post-insert"
        value="org.hibernate.ejb.event.EJB3PostInsertEventListener,org.hibernate.envers.event.AuditEventListener" />
        <property name="hibernate.ejb.event.post-update"
        value="org.hibernate.ejb.event.EJB3PostUpdateEventListener,org.hibernate.envers.event.AuditEventListener" />
        <property name="hibernate.ejb.event.post-delete"
        value="org.hibernate.ejb.event.EJB3PostDeleteEventListener,org.hibernate.envers.event.AuditEventListener" />
        <property name="hibernate.ejb.event.pre-collection-update"
        value="org.hibernate.envers.event.AuditEventListener" />
        <property name="hibernate.ejb.event.pre-collection-remove"
        value="org.hibernate.envers.event.AuditEventListener" />
        <property name="hibernate.ejb.event.post-collection-recreate"
        value="org.hibernate.envers.event.AuditEventListener" />
        </properties>
</persistence-unit>

Кажется, работает, но я делаю это правильно? Могу ли я сделать это другим/лучшим способом?

4b9b3361

Ответ 1

Я только что нашел ответ на свой вопрос в сообщении coderanch.com.

Похоже, я могу обойти использование JpaVendorAdapter, если я просто укажу поставщика JPA внутри определения единицы сохранения в файле persistence.xml следующим образом:

<persistence-unit name="myPU" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
            .
            .
            .

Ответ 2

Прежде всего, я не уверен, зачем его использовать, но я знаю, что не обязательно использовать его

В Документах API

Укажите реализацию JpaVendorAdapter для желаемого поставщика JPA, если таковой имеется. Это приведет к инициализации соответствующих значений по умолчанию для данного провайдера, таких как класс поставщика сохранения и JpaDialect, если локально не отменено на этом FactoryBean.

То, как я это понимаю, является альтернативой тому, как мы указываем конфигурации спящего режима. Я не использовал его, и не нашел его на Spring API docs. Это не обязательно, пусть оно будет инициализировано значением .

Есть даже некоторые проблемы в Spring с jpaVendorAdapter, указанными в JIRA. Также есть вопрос SO здесь.