2010-04-17 10 views
3

J'ai une application Web extrêmement simple s'exécutant dans Tomcat en utilisant Spring 3.0.2, Hibernate 3.5.1, JPA 2 et Derby. Je définis toute ma connectivité de base de données dans persistence.xml et en utilisant simplement Spring pour l'injection de dépendance. J'utilise Derby intégré comme base de données.Pourquoi Hibernate ignore-t-il les propriétés standardisées de JPA2 dans mon fichier persistence.xml?

Tout fonctionne correctement lorsque je définis les propriétés du pilote et url dans persistence.xml de la manière Hibernate classique comme ainsi:

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

Les problèmes surviennent lorsque je passe ma configuration aux propriétés standardisées de JPA2 comme ainsi:

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

Lorsque vous utilisez les touches de propriété JPA2, l'application bails dur à l'exception suivante:

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

Est-ce que quelqu'un sait pourquoi cela échoue?

REMARQUE: J'ai copié les chaînes de propriétés javax ... directement à partir de la documentation de référence d'Hibernate, donc une faute de frappe est extrêmement improbable. Je ne peux pas reproduire (je n'utilise pas le printemps cependant)

Répondre

3

La réponse semble être qu'il s'agit d'un problème de printemps, probablement dû à l'utilisation du LocalContainerEntityManagerFactoryBean. J'utilisais Spring pour activer l'utilisation de l'annotation @PersistenceContext plutôt que d'initialiser manuellement l'EntityManager dans le chemin Java SE standard. Lorsque j'ai remplacé l'utilisation @PersistenceContext avec Persistence.createEntityManagerFactory("WebApp").createEntityManager(); (et a commenté la substance EntityManager hors de ma config printemps), tout a fonctionné comme prévu.

Pour référence, ce fut la configuration Spring j'utilisais:

<?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> 
2

Voici mon persistence.xml, et ça marche pour moi:

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

Juste au cas où, voici les dépendances de Maven j'utilise:

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

Mon classpath ci-dessous:

alt text http://img263.imageshack.us/img263/8095/screenshot006qt.png

+0

Merci pour la vérification indépendante, il m'a mis sur la bon chemin pour répondre à ma question. – Ophidian

2

Si vous n'utilisez pas la dépendance Maven et en utilisant seulement éclipser les paramètres classpath, il vous suffit de mettre les fichiers jar ci-dessus dans classpath de mise en veille prolongée 3,5 et au-dessus

1) hiberner noyau Jar

2) hibernent annotations pot

3) l'enregistrement jboss j ar

4) veille prolongée pot de gestionnaire d'entités

API JPA 2. jar (son inclus dans la distribution de mise en veille prolongée).

J'ai eu des problèmes similaires et j'ai utilisé cette approche et cela a fonctionné. Obtenir tout le pot de depedent de la même version de la distribution est la meilleure idée.Si vous trouvez une erreur, vous pouvez la trouver dans les journaux et continuer à mettre le pot dans le classpath

1

Je pense que c'est un problème lié à la classe du fournisseur. L'élément contient des éléments imbriqués utilisés pour spécifier les paramètres spécifiques au fournisseur. Par Fournisseur, je veux dire la classe spécifiée comme le fournisseur . Ainsi fournisseur et propriétés vont de pair. Je faisais face à la même question avec Hibernate et PostgreSQL

Donc, pour le fournisseur

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

je dois fournir suivante dans 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"/> 
+0

Idem avec Hibernate 4.1 et Oracle. La spécification des propriétés spécifiques d'hibernation fonctionne, les propriétés JPA semblent être ignorées. Pas d'humeur à le retrouver ... – mmey