# JBoss,Axis2,Hibernate/JPA,Oracle - EntityManager Problem



## Wili.Firulais (22. Dez 2007)

Hallo,

Ich bekomme die Fehlermeldung:
"No Persistence provider for EntityManager named ..."

Hab schon das Internet zu dem Thema dursucht aber nichts hat geholfen.
Würde mich (nach zwei Tagen herumprobieren) über weitere Ideen, Links, Anregungen, Referenzen und natürlich Lösungen freuen.

* Situation
Axis2 WebService Implementierung mit JPA/Hibernate Zugriff (ohne Java EE) auf eine Oracle 10g Datenbank.

- JBoss 4.0.3SP1
- AXIS 2 (axis2.war)
- Hibernate 3 (antlr-2.7.6.jar, asm.jar, cglib-2.1.3.jar, commons-collections-2.1.1.jar, commons-collections-2.1.1.jar, dom4j-1.6.1.jar, ehcache-1.2.3.jar, ejb3-persistence.jar, hibernate3.jar, hibernate-annotations.jar, hibernate-commons-annotations.jar, hibernate-entitymanager.jar, javassist.jar, jboss-archive-browsing.jar, jta.jar)
- Oracle 10 (dms.jar, ojdbc5dms.jar, ojdl.jar, orai18n.jar)

Wenn jemand Tipps und Erfahrugswerte mit diesem Setup hat wo die .jar Dateien am besten zu plazieren sind wäre echt toll. Als "standalone" funktioniert das POJO (main) welches als WebService für Axis2 definiert wurde. Nach deployment als .aar auf JBoss erhalte ich nach testen (soapUI) nur die Meldung "No Persistence provider for EntityManager named ..."

Vielen dank für alle Rückmeldungen,
Willi



* Vorschläge die mir leider nicht weitergeholfen haben:
Hibernate JPA problem:
“No Persistence provider for EntityManager named …” http://forum.java.sun.com/thread.jspa?threadID=5169272&messageID=9649764

S: There may be a mismatch in your source and configuration. Just make sure you keep those two in sync if you change them. The generated persistence.xml file has the following entry 
<persistence-unit name="jee5PU" transaction-type="RESOURCE_LOCAL"> 

But the generated EntityManagerHelper.java file has this entry 
emf = Persistence.createEntityManagerFactory("jee5 pu");

S: 
http://www.myeclipseide.com/PNphpBB2-viewtopic-t-19323-sid-298793bf1aea4950e21af1f405f7d14a.html
http://forum.java.sun.com/thread.jspa?threadID=5169272

S: add ejb3-persistence.jar to classpath, as it is Hibernate's wrapper class for the Java persistence API. Note that the above error message also may occurs if hibernate-entitymanager.jar is missing from the classpath.
http://dewarim.de/wms/error/no_persistence_provider_for_entitymanager


S: Check the provider you are using. The problem is your persistence provide is invalid... it should be something like:
<provider>mysql.toplink.essentials.PersistenceProvider</provider>
<provider> oracle.toplink.essentials.PersistenceProvider </provider>
http://www.myeclipseide.com/PNphpBB2-viewtopic-t-17323-sid-08e82e38591eab877e20737ad0e1fc5a.html

S: The META-INF dir under the /src dir is where it needs to be, the classloader doesn't have any access to the META-INF dir under the web project, that is for deployment descriptors for the app server, not for the persistence.xml file (?)
http://www.myeclipseide.com/PNphpBB2-viewtopic-t-17323-sid-08e82e38591eab877e20737ad0e1fc5a.html

S: Your persistence file has to be in META-INF and not directly in the class path. Are you trying to run your code outside of a web container by chance?

The META-INF dir under the /src dir is where it needs to be, the classloader doesn't have any access to the META-INF dir under the web project, that is for deployment descriptors for the app server, not for the persistence.xml file.

S: if this works on your development environment but non the server then check if all needed hibernate libraries are available on the server. If not deploy them to the server/lib or to your service/lib.


----------



## Guest (22. Dez 2007)

Wie die Fehlermeldung sagt, fehlt bei dir in persistence.xml der Provider. Bei Hibernate ist es org.hibernate.ejb.HibernatePersistence
	
	
	
	





```
<persistence-unit name="jee5PU" transaction-type="RESOURCE_LOCAL">
   <provider>org.hibernate.ejb.HibernatePersistence</provider>
   ...
```


----------



## Willi.Firulais (23. Dez 2007)

Danke "Gast" für den Lösungsansatz. Die persistence.xml ist so definiert und funktioniert ohne Axis auch wunderbar.

Sobald ich es als .aar nach Axis2 deploye bekomme ich den Fehler:
"No Persistence provider for EntityManager named ..." 

Dürfte was mit den Class Loader zu tun haben, da Axis bereits eine .war ist. Dort ist zwar vorgesehen Bibliotheken im .aar in ein lib Verzeichnis zu legen - was aber hier anscheinend nicht funktioniert.

Hat jemand vielleicht ein funktionierendes Beispiel mit den Technolgie-Mix: JBoss, Axis2, Hibernate/JPA (ohne EJB), Oralce

Vielen Danke für jede Hilfe, denn anscheinend gibts im ganzen Internet nix dazu.


----------



## Willi.Firulais (23. Dez 2007)

Here is the (not working) example (consits of 4 files).

Das Entwicklungsverzeichnis:
src/company/customer/service/CableService.java
src/company/customer/model/Cable.java
src/META-INF/services.xml
src/META-INF/persistence.xml

Das Deployment Verzeichnis:
classes/company/customer/service/CableService.java
classes/company/customer/model/Cable.java
classes/lib
classes/META-INF/services.xml
classes/META-INF/persistence.xml
classes/META-INF/MANIFEST.MF

src/company/customer/service/CableService.java:

```
package company.customer.service;

import company.customer.model.Cable;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import javax.persistence.Query;

public class CableService {

    public CableService() {
    }

    public String getCable(Long id) {
      EntityManagerFactory emf = Persistence.createEntityManagerFactory("jee5PU");
      EntityManager em = emf.createEntityManager();

      Cable cable1 = em.find(Cable.class, id);
      return cable1;
    }
}
```

Das POJO (ohne die kompletten Attribute und getters darzustellen).

src/company/customer/model/Cable.java

```
package company.customer.model;

import java.io.Serializable;

import java.util.Date;
import javax.persistence.*;

@Entity
@Table(name="TAB_CABLE")
public class Cable implements Serializable{

    private Long syst_id;

    public Cable() {}

    @Id
    public Long getSyst_id() { return this.syst_id; }
    public void setSyst_id(Long syst_id) { this.syst_id=syst_id; }
}
```

src/META-INF/persistence.xml

```
<?xml version="1.0" encoding="windows-1252" ?>
<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"
             version="1.0" xmlns="http://java.sun.com/xml/ns/persistence">
  <persistence-unit name="jee5PU">
     <provider>org.hibernate.ejb.HibernatePersistence</provider>
     <class>iqsoft.tevis.model.Cable</class>
     <properties>
            <property name="hibernate.connection.driver_class" value="oracle.jdbc.driver.OracleDriver"/>
            <property name="hibernate.connection.url" value="jdbc:oracle:thin:@localhost:1521:XE"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.OracleDialect"/>
            <property name="hibernate.connection.username" value="scott"/>
            <property name="hibernate.connection.password" value="tiger"/>

            <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
            
            <property name="hibernate.show_sql" value="true"/>
     </properties>
 </persistence-unit>
</persistence>
```

src/META-INF/services.xml

```
<service name="CableService">
    <description>
        Sample service to demonstrate Axis2 with Hibernate
    </description>
    <messageReceivers>
        <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
                         class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
        <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
                         class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
    </messageReceivers>
    <parameter name="ServiceClass" locked="false">company.customer.service.CableService</parameter>
</service>
```

MANIFEST.MF

```
Manifest-Version: 1.0
```


----------



## Guest (23. Dez 2007)

Was passiert, wenn du die Beans (Session und EntityBeans) in einem Jar, die Services in ein Aar, Web-Sachen in ein War alles zusammen in ein EAR verpackst und deployest?

Meine Vermutung ist, dass das classes Verzeichnis in dem aar Archiv nicht nach der persistence.xml dursucht 
wird. Eine Trennung der Präsentations-, Service- und Persistence-Schicht ist sowieso immer ratsam.
In deinen Services kannst du über lokale Interfaces auf die Facade(n) der Bussiness- und Persistenzschicht
zugreifen.


----------

