Почему Hibernate игнорирует стандартизированные свойства JPA2 в моем файле persistence.xml?

У меня есть чрезвычайно простое веб-приложение, работающее в Tomcat с использованием Spring 3.0.2, Hibernate 3.5.1, JPA 2 и Derby. Я определяю все подключения к базе данных в persistence.xml и просто использую Spring для внедрения зависимостей. Я использую встроенный Derby в качестве своей базы данных.

Все работает правильно, когда я определяю свойства драйвера и URL-адреса в persistence.xml классическим способом Hibernate следующим образом:

<property name="hibernate.connection.driver_class" value="org.apache.derby.jdbc.EmbeddedDriver"/>
<property name="hibernate.connection.url" value="jdbc:derby:webdb;create=true"/>

Проблемы возникают, когда я переключаю свою конфигурацию на стандартизированные свойства JPA2 следующим образом:

<property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:derby:webdb;create=true"/>

При использовании ключей свойств JPA2 приложение жестко отключается со следующим исключением:

java.lang.UnsupportedOperationException: The user must supply a JDBC connection

Кто-нибудь знает, почему это не удается?

ПРИМЕЧАНИЕ. Я скопировал строки свойств javax... прямо из справочной документации по Hibernate, так что опечатка крайне маловероятна.


person Ophidian    schedule 17.04.2010    source источник


Ответы (4)


Ответ, по-видимому, заключается в том, что это проблема Spring, вероятно, связанная с использованием файла LocalContainerEntityManagerFactoryBean. Я использовал Spring, чтобы включить использование аннотации @PersistenceContext, а не вручную инициализировать EntityManager стандартным способом Java SE. Когда я заменил использование @PersistenceContext на Persistence.createEntityManagerFactory("WebApp").createEntityManager(); (и прокомментировал материал EntityManager из моей конфигурации Spring), все заработало, как и ожидалось.

Для справки, это была конфигурация Spring, которую я использовал:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd
            http://www.springframework.org/schema/tx
            http://www.springframework.org/schema/tx/spring-tx.xsd">

    <context:component-scan base-package="net.webapp"/>
    <tx:annotation-driven/>

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"/>

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
            <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>
</beans>
person Ophidian    schedule 19.04.2010

Если вы не используете зависимость от Maven и используете только настройки пути к классам eclipse, вам просто нужно поместить указанные выше файлы jar в путь к классам из спящего режима 3.5 и выше.

1) Jar ядра гибернации

2) банка аннотаций гибернации

3) банку регистрации jboss

4) банка менеджера сущностей гибернации

JPA API 2. jar (включен в дистрибутив спящего режима).

У меня были похожие проблемы, и я использовал этот подход, и он сработал. Лучше всего получить все зависимые jar-файлы из одной и той же версии дистрибутива. Если вы обнаружите какую-либо ошибку, вы можете найти ее в журналах и продолжить помещать банку в путь к классам.

person Rajesh Singh    schedule 30.10.2011

Невозможно воспроизвести (хотя я не использую Spring). Вот мой persistence.xml, и он у меня работает:

<?xml version="1.0" encoding="UTF-8"?>
<persistence
    xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
    version="2.0">

  <persistence-unit name="PetstorePu" transaction-type="RESOURCE_LOCAL">

    <properties>
      <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver"/>
      <property name="javax.persistence.jdbc.url" value="jdbc:derby:webdb;create=true"/>

      <property name="hibernate.show_sql" value="true"/>
      <property name="hibernate.hbm2ddl.auto" value="update"/>
    </properties>
  </persistence-unit>
</persistence>

На всякий случай вот зависимости maven, которые я использую:

<!-- JPA2 provider -->
<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-entitymanager</artifactId>
  <version>3.5.1-Final</version>
</dependency>
<!-- Logging -->
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-simple</artifactId>
  <version>1.5.10</version>
</dependency>
<!-- JDBC driver -->
<dependency>
  <groupId>org.apache.derby</groupId>
  <artifactId>derby</artifactId>
  <version>10.5.3.0_1</version>
</dependency>

Мой путь к классам ниже:

альтернативный текст

person Pascal Thivent    schedule 18.04.2010
comment
Спасибо за независимую проверку, она поставила меня на правильный путь, чтобы ответить на мой вопрос. - person Ophidian; 19.04.2010

Я думаю, что это проблема, связанная с классом провайдера. Элемент содержит вложенные элементы, используемые для указания параметров, специфичных для поставщика. Под поставщиком я подразумеваю класс, указанный как поставщик. Таким образом, поставщик и свойства идут рука об руку. Я столкнулся с той же проблемой с Hibernate и PostgreSQL.

Итак, для провайдера

   <provider>org.hibernate.ejb.HibernatePersistence</provider>

Я должен предоставить следующее в файле persistence.xml

   <property name="hibernate.connection.driver_class" value="org.postgresql.Driver"/>
   <property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/reverseepg-foxtel"/>
   <property name="hibernate.connection.username" value="postgres"/>
   <property name="hibernate.connection.password" value="password"/>

   If I provide below properties it doesn't work

   <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/>
   <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost:5432/reverseepg-foxtel"/>
   <property name="javax.persistence.jdbc.user" value="postgres"/>
   <property name="javax.persistence.jdbc.password" value="password"/>
person Vivek    schedule 08.01.2013
comment
То же самое с Hibernate 4.1 и Oracle. Указание конкретных свойств гибернации работает, свойства JPA, похоже, игнорируются. Нет настроения выслеживать... - person mmey; 04.06.2013