Openejb مع Tomcat و Hibernate و JPA
سؤال
أنا أستخدم OpeneJB 3.1.3 مضمنًا في Tomcat 5.5.26 وأستخدم Hibernate 3.6 كمزود JPA.
ها هي المثابرة. 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>
هذا هو الكود الخاص بي:
@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();
...
}
...
}
عندما أقوم بتشغيل Tomcat مع OpeneJB وأرشيفات حرب التطبيق الخاصة بي ، فشل النشر مع تتبع مكدس الاستثناء:
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
عند البحث ، وجدت الفصل javax/persistence/spi/ProviderUtil
هو جزء من المواصفات Java EE 6/JPA 2.0 ، والتي لا تدعمها OpeneJB. لكنني لا أعتقد في تطبيقي ، أستخدم أي JPA 2.0. أنا أذكر على وجه التحديد في pressistence.xml من 1.0. أعرف أن Hibernate 3.6 يدعم JPA 2.0. لا أعرف ما إذا كانت معايير Hibernate API جزءًا من JPA 2.0 ، لكن هذا لا ينبغي أن يتسبب في مشكلة bcause التي ذكرتها على وجه التحديد 1.0 في الثبات. xml.
شكرا لك على مساعدتك.
يعتبر
إرادة
المحلول
عند البحث ، وجدت فئة javax/pressistence/spi/providerutil هي جزء من Java EE 6/JPA 2.0 spec
هذا صحيح.
التي لا تدعمها OpeneJB.
ليس بعد. يتم تتبع هذا بواسطة OpeneJB-1236.
لكني لا أفكر في تطبيقي ، أستخدم أي JPA 2.0
سواء كنت تستخدم ميزات JPA 2.0 أم لا ، فإن بعض التغييرات في واجهات مختلفة تتطلب دعمًا واضحًا من الحاويات.
أنا أذكر على وجه التحديد في pressistence.xml من 1.0.
هذا لا يحدث أي فرق ، لا تزال الحاوية تحاول تحميل تطبيق JPA 2.0.
لا أعرف ما إذا كانت معايير Hibernate API جزءًا من JPA 2.0
JPA 2.0 لديه واجهة برمجة تطبيقات معايير جديدة ولكن معايير السبات API هو جزء من ... السبات. من ما يمكنني رؤيته ، فأنت تستخدم API Hibernate ، وبالتالي فإن اقتراحي هو استخدام تطبيق JPA 1.0 - أي heibernate entitymanager 3.4.0.ga وتبعياتها ، والتي توفر واجهة برمجة التطبيقات هذه. لا تحتاج إلى JPA 2.0 على أي حال.
لا يوجد الكثير من المعلومات على الشبكة حول مطابقة إصدارات Hibernate-JPA. فهل تقصد أن مشاريع entitymanager وشروحات السبات هي تطبيقات مواصفات JPA 1.0 ، ويحتوي المشروع الأساسي على السبات (غير JPA INM) و JPA 2.0؟
Hibernate EntityManager هو المشروع الذي يوفر تنفيذ JPA.
- Hibernate EntityManager 3.4.0.ga هو تنفيذ JPA 1.0
- Hiberante enittymanager 3.5+ هو تطبيق JPA 2.0
إنه يعتمد على قلب السبات (وبعض المكتبات الأخرى). لاستخدام Hibernate EntityManager 3.4.0.ga ، ستحتاج إلى ما يلي:
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
أنا أستخدم Maven ، لذا يجب عليّ إعلان الاعتماد على heibernate-entitymanager ولكن إذا لم تفعل ذلك ، فاحصل على ملف حزمة من SourceForge.