OpenEJB con Tomcat e Hibernate e JPA
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
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 .