Domanda

sto usando OpenEJB 3.1.3 integrato in Tomcat 5.5.26 e utilizzare hibernate 3.6 come provider JPA.

Ecco il mio 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>

Ecco il mio codice:

@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();
...
    }
...
}

Quando eseguo Tomcat con OpenEJB e la mia app archivi di guerra in esso, la distribuzione non riuscita con stack eccezione:

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

Al momento la ricerca, ho trovato il javax/persistence/spi/ProviderUtil classe è parte di Java EE 6 / JPA 2.0 spec, che non è supportato da OpenEJB. Ma io non credo che nella mia app che uso ogni JPA 2.0. Ho espressamente citato in persistence.xml di 1,0. So hibernate 3.6 supporti JPA 2.0. Non so se Criteri API di Hibernate è parte di JPA 2.0, ma che non dovrebbe causare il problema bcause ho specificamente menzionate 1.0 in persistence.xml.

Grazie per il vostro aiuto.

Saluti

Will

È stato utile?

Soluzione

  

Al momento la ricerca, ho trovato la classe javax / persistenza / SPI / ProviderUtil fa parte di Java EE 6 / JPA 2.0 spec

Questa è corretto.

  

, che non è supportato da OpenEJB.

Non ancora. Questo è monitorata da OpenEJB-1236 .

  

Ma io non credo nella mia app che uso ogni JPA 2.0

Sia che si utilizzi funzioni JPA 2.0 o no, alcuni cambiamenti in varie interfacce richiedono il supporto esplicito dai contenitori.

  

ho espressamente citato in persistence.xml di 1,0.

Questo non fa alcuna differenza, il contenitore è ancora cercando di caricare un'implementazione JPA 2.0.

  

Non so se Criteri API di Hibernate è parte di JPA 2.0

JPA 2.0 ha una nuova API di criteri, ma Criteri di Hibernate API è parte di ... Hibernate. Da quello che posso vedere, si sta utilizzando Hibernate API e il mio suggerimento è quindi quello di utilizzare la sua attuazione JPA 1.0 - vale a dire Hibernate EntityManager 3.4.0.GA e le sue dipendenze, che forniscono questa API. Non hai bisogno di JPA 2.0 in ogni caso.


  

Non ci sono molte informazioni in rete su versioni hibernate-JPA corrispondenza. Quindi vuoi dire i progetti Hibernate EntityManager e annotazioni sono le implementazioni di JPA specifiche 1.0, e del progetto Hibernate core contiene l'ibernazione nucleo (non JPA impl) e JPA 2.0 impl?

Hibernate EntityManager è il progetto che prevede l'implementazione JPA.

  • Hibernate EntityManager 3.4.0.GA è un'implementazione JPA 1.0
  • Hiberante EnittyManager 3.5+ è un'implementazione JPA 2.0

Si basa su Hibernate core (e alcune altre biblioteche). Per usare Hibernate EntityManager 3.4.0.GA, è necessario il seguente:

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

sto usando Maven quindi non mi resta che dichiarare una dipendenza da hibernate-EntityManager ma se non lo fai, ottiene un fascio da SourceForge .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top