5 votes

OpenEJB avec Tomcat et Hibernate et JPA

J'utilise OpenEJB 3.1.3 intégré à Tomcat 5.5.26 et j'utilise hibernate 3.6 comme fournisseur JPA.

Voici mon fichier persistence.xml :

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
             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_1_0.xsd">

  <persistence-unit name="manager1" transaction-type="JTA">

    <!-- provider is optional if you work with only 1 JPA provider -->
    <!--
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    -->

    <jta-data-source>java:/DefaultDS</jta-data-source>

<!--
    <properties>
      <property name="hibernate.ejb.cfgfile" value="/hibernate.cfg.xml" />
    </properties>
-->

  </persistence-unit>

</persistence>

Voici mon code :

@Stateless
public class MapSearchManager implements MapSearchLocal, MapSearchRemote {
    @PersistenceContext
    private EntityManager em;
...
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public int queryDataSelectionNumRecords(MapSearchParamBean paramBean) {
        Criteria c = createCriteria(paramBean);
        c.setProjection(Projections.rowCount());

        List l = c.list();
...
    }
...
}

Lorsque j'exécute Tomcat avec OpenEJB et les archives de mon application, le déploiement échoue avec une trace d'exception :

2010-10-27 18:13:35,374 - ERROR - Unable to deploy collapsed ear in war /wma: Exception: Creating application failed: C:\apache-tomcat-5.5.26\webapps\wma: javax/persistence/spi/ProviderUtil
org.apache.openejb.OpenEJBException: Creating application failed: C:\apache-tomcat-5.5.26\webapps\wma: javax/persistence/spi/ProviderUtil
        at org.apache.openejb.assembler.classic.Assembler.createApplication(Assembler.java:666)
        at org.apache.openejb.assembler.classic.Assembler.createApplication(Assembler.java:449)
        at org.apache.openejb.tomcat.catalina.TomcatWebAppBuilder.start(TomcatWebAppBuilder.java:249)
        at org.apache.openejb.tomcat.catalina.GlobalListenerSupport.lifecycleEvent(GlobalListenerSupport.java:58)
        at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:120)
        at org.apache.catalina.core.StandardContext.start(StandardContext.java:4148)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:760)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:740)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:544)
        at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:926)
        at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:889)
        at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:492)
        at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1149)
        at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
        at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:120)
        at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1022)
        at org.apache.catalina.core.StandardHost.start(StandardHost.java:736)
        at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1014)
        at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
        at org.apache.catalina.core.StandardService.start(StandardService.java:448)
        at org.apache.catalina.core.StandardServer.start(StandardServer.java:700)
        at org.apache.catalina.startup.Catalina.start(Catalina.java:552)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:295)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:433)
Caused by: java.lang.NoClassDefFoundError: javax/persistence/spi/ProviderUtil
        at java.lang.Class.getDeclaredConstructors0(Native Method)
        at java.lang.Class.privateGetDeclaredConstructors(Class.java:2389)
        at java.lang.Class.getConstructor0(Class.java:2699)
        at java.lang.Class.newInstance0(Class.java:326)
        at java.lang.Class.newInstance(Class.java:308)
        at org.apache.openejb.assembler.classic.PersistenceBuilder.createEntityManagerFactory(PersistenceBuilder.java:179)
        at org.apache.openejb.assembler.classic.Assembler.createApplication(Assembler.java:489)
        ... 27 more

En cherchant, j'ai trouvé la classe javax/persistence/spi/ProviderUtil fait partie de la spécification Java EE 6/JPA 2.0, qui n'est pas supportée par OpenEJB. Mais je ne pense pas utiliser JPA 2.0 dans mon application. Je mentionne spécifiquement dans persistence.xml de 1.0. Je sais qu'Hibernate 3.6 supporte JPA 2.0. Je ne sais pas si l'API Criteria d'Hibernate fait partie de JPA 2.0 mais cela ne devrait pas poser de problème car j'ai spécifiquement mentionné 1.0 dans persistence.xml.

Merci pour votre aide.

Salutations

Will

4voto

Pascal Thivent Points 295221

En cherchant, j'ai trouvé la classe javax/persistence/spi/ProviderUtil qui fait partie de la spécification Java EE 6/JPA 2.0.

C'est exact.

qui n'est pas supporté par OpenEJB.

Pas encore. Ceci est suivi par OPENEJB-1236 .

Mais je ne pense pas avoir utilisé JPA 2.0 dans mon application.

Que vous utilisiez ou non les fonctionnalités de JPA 2.0, certaines modifications apportées à diverses interfaces nécessitent une prise en charge explicite par les conteneurs.

Je mentionne spécifiquement dans le persistence.xml de la 1.0.

Cela ne fait aucune différence, le conteneur essaie toujours de charger une implémentation JPA 2.0.

Je ne sais pas si l'API Critères d'Hibernate fait partie de JPA 2.0.

JPA 2.0 dispose d'une nouvelle API de critères mais L'API de critères d'Hibernate fait partie de... Hibernate. De ce que je peux voir, vous utilisez l'API d'Hibernate et ma suggestion est donc d'utiliser son implémentation JPA 1.0 - c'est-à-dire Hibernate EntityManager 3.4.0.GA et ses dépendances, qui fournissent cette API. Vous n'avez pas besoin de JPA 2.0 de toute façon.


Il n'y a pas beaucoup d'informations sur le net concernant la correspondance des versions de Hibernate-Jpa. Vous voulez donc dire que les projets Hibernate EntityManager et Annotations sont les implémentations de la spécification JPA 1.0, et que le projet Hibernate Core contient le noyau d'Hibernate (impl. non-JPA) et l'impl. JPA 2.0 ?

Hibernate EntityManager est le projet qui fournit l'implémentation JPA.

  • Hibernate EntityManager 3.4.0.GA est une implémentation JPA 1.0.
  • Hiberante EnittyManager 3.5+ est une implémentation JPA 2.0.

Il s'appuie sur Hibernate Core (et quelques autres bibliothèques). Pour utiliser Hibernate EntityManager 3.4.0.GA, vous aurez besoin des éléments suivants :

org.hibernate:hibernate-entitymanager:jar:3.4.0.GA:compile
+- org.hibernate:ejb3-persistence:jar:1.0.2.GA:compile
+- org.hibernate:hibernate-commons-annotations:jar:3.1.0.GA:compile
+- org.hibernate:hibernate-annotations:jar:3.4.0.GA:compile
+- org.hibernate:hibernate-core:jar:3.3.0.SP1:compile
|  +- antlr:antlr:jar:2.7.6:compile
|  \\- commons-collections:commons-collections:jar:3.1:compile
+- org.slf4j:slf4j-api:jar:1.5.10:compile
+- dom4j:dom4j:jar:1.6.1:compile
|  \\- xml-apis:xml-apis:jar:1.0.b2:compile
+- javax.transaction:jta:jar:1.1:compile
\\- javassist:javassist:jar:3.4.GA:compile

J'utilise Maven donc il me suffit de déclarer une dépendance sur hibernate-entitymanager mais si vous ne le faites pas, obtenez une bundle de SourceForge .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X