Почему мне нужно было определить адаптер поставщика Hibernate-JPA в контексте приложения Spring? - PullRequest
14 голосов
/ 13 марта 2012

Я потратил дни и дни, пытаясь получить работающее соединение с базой данных для моих интеграционных тестов 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>

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

Ответы [ 2 ]

17 голосов
/ 13 марта 2012

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

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

<persistence-unit name="myPU" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
            .
            .
            .
5 голосов
/ 13 марта 2012

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

Из документов API,

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...