Hibernate - Persistence Unit Not Found?

flashray

Erfahrenes Mitglied
Hallo,

hänge grad an folgendem Problem: javax.persistence.PersistenceException: No Persistence provider for EntityManager named ...

Also das Projekt in aller kürze ist: Ein Webserviceprojekt welches auf einem Tomcat Server läuft soll Daten per Hibernate aus einer Datenbank (PostgreSQL) auslesen können. Da ich noch nicht richtig vertraut bin mit Hibernate, kann ich mit der Fehlermeldung nichts anfangen. Arbeite mit Eclipse.

Code:
<?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="hska"
		transaction-type="RESOURCE_LOCAL">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		<class>de.hska.benutzerverwaltung.db.Adresse</class>
		<class>de.hska.benutzerverwaltung.db.Bankverbindung</class>
		<class>de.hska.bestellverwaltung.db.BestellPos</class>
		<class>de.hska.bestellverwaltung.db.Bestellung</class>
		<class>de.hska.benutzerverwaltung.db.Bewertung</class>
		<class>de.hska.fahrzeugverwaltung.db.Fahrzeug</class>
		<class>de.hska.fahrzeugverwaltung.db.FahrzeugTyp</class>
		<class>de.hska.fahrzeugverwaltung.db.GebrFahrzeuge</class>
		<class>de.hska.fahrzeugverwaltung.db.GebrauchteVerkauf</class>
		<class>de.hska.fahrzeugverwaltung.db.Lieferanten</class>
		<class>de.hska.benutzerverwaltung.db.Login</class>
		<class>de.hska.fahrzeugverwaltung.db.Marke</class>
		<class>de.hska.benutzerverwaltung.db.Kunde</class>
		<class>de.hska.bestellverwaltung.db.Versand</class>

		<properties>
			<!-- PostgreSQL (entfaellt bei Appserver, z.B. JBoss) -->
			<property name="hibernate.dialect"
				value="org.hibernate.dialect.PostgreSQLDialect" />
			<property name="hibernate.connection.url"
				value="jdbc:postgresql:autohaus" />
			<property name="hibernate.connection.driver_class"
				value="org.postgresql.Driver" />
			<property name="hibernate.connection.username"
				value="postgres" />
			<property name="hibernate.connection.password" value="1234" />
			<property name="hibernate.default_schema" value="public" />
		</properties>
	</persistence-unit>
</persistence>

Java:
package de.hska.util;

import static de.hska.util.LogUtil.begin;
import static de.hska.util.LogUtil.end;

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

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import de.hska.bestellverwaltung.BestellverwaltungImpl;
import de.hska.bestellverwaltung.db.BestellverwaltungDao;
import de.hska.bestellverwaltung.db.BestellverwaltungDaoImpl;
import de.hska.benutzerverwaltung.KundenverwaltungImpl;
import de.hska.benutzerverwaltung.db.KundenverwaltungDao;
import de.hska.benutzerverwaltung.db.KundenverwaltungDaoImpl;
import de.hska.fahrzeugverwaltung.FahrzeugverwaltungImpl;
import de.hska.fahrzeugverwaltung.db.FahrzeugverwaltungDao;
import de.hska.fahrzeugverwaltung.db.FahrzeugverwaltungDaoImpl;


public class HskaUtil {
	private static final Log LOG = LogFactory.getLog(HskaUtil.class);
	private static final boolean DEBUG = LOG.isDebugEnabled();
	private static final String PERSISTENCE_UNIT = "hska";
	
	private static EntityManagerFactory emf;
	private static EntityManager em;

	/**
	 */
	public static EntityManager getEntityManager() {
		if (DEBUG) begin(LOG);
		if (em != null) {
			if (DEBUG) {
				final String logMsg = MessagesUtil.getMessage("log.jpa.em.reused");
				end(LOG, logMsg);
			}

			return em;
		}

		if (emf == null) {
			final String logMsg = MessagesUtil.getMessage("log.jpa.emf.created");
			LOG.info(logMsg);
			emf = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT);
		}
		em = emf.createEntityManager();
		
		if (DEBUG) {
			final String logMsg = MessagesUtil.getMessage("log.jpa.em.created");
			end(LOG, logMsg);
		}
		return em;
	}
	
	/**
	 */
	public static void init() {
		if (DEBUG) begin(LOG, "In der INIT()");
		if (emf == null) {
			if (DEBUG) end(LOG, "EMF = NULL");
			emf = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT);
			if(emf == null)
				if (DEBUG) end(LOG, "EMF = IMMER NOCH NULL");
			final String logMsg = MessagesUtil.getMessage("log.jpa.emf.created");
			LOG.info(logMsg);
		}
		if (DEBUG) end(LOG);
	}
	
	/**
	 */
	public static void close() {
		if (DEBUG) begin(LOG);
		if (em != null) {
			em.close();
			em = null;
		}
		if (DEBUG) end(LOG);
	}
	
	/**
	 */
	public static void shutdown() {
		if (DEBUG) begin(LOG);
		
		close();
		
		if (emf != null) {
			emf.close();
			emf = null;
		}
		final String logMsg = MessagesUtil.getMessage("log.jpa.emf.closed");
		LOG.info(logMsg);
		if (DEBUG) end(LOG);
	}

	/**
	 */
	// WARUM RÜCKGABEWERT KUNDENVERWALTUNG (OHNE IMPL?)
	public static KundenverwaltungImpl getKundenverwaltung() {
		return new KundenverwaltungImpl(); //Impl
	}
	
	/**
	 */
	public static KundenverwaltungDao getKundenverwaltungDao() {
		return new KundenverwaltungDaoImpl();
	}

	/**
	 */
	public static BestellverwaltungImpl getBestellverwaltung() {
		return new BestellverwaltungImpl(); //Impl
	}
	
	/**
	 */
	public static BestellverwaltungDao getBestellverwaltungDao() {
		return new BestellverwaltungDaoImpl();
	}
	
	
	
	public static FahrzeugverwaltungImpl getFahrzeugverwaltung() {
		return new FahrzeugverwaltungImpl(); //Impl
	}
	
	
	public static FahrzeugverwaltungDao getFahrzeugverwaltungDao() {
		return new FahrzeugverwaltungDaoImpl();
	}
}

Code:
HTTP Status 500 - 

--------------------------------------------------------------------------------

type Exception report

message 

description The server encountered an internal error () that prevented it from fulfilling this request.

exception 

javax.persistence.PersistenceException: No Persistence provider for EntityManager named hska
	javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:56)
	javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:34)
	de.hska.util.HskaUtil.getEntityManager(HskaUtil.java:48)
	de.hska.fahrzeugverwaltung.FahrzeugverwaltungImpl.findFahrzeug(FahrzeugverwaltungImpl.java:159)
	de.hska.fahrzeugverwaltung.rest.FahrzeugverwaltungResource.findFahrzeug(FahrzeugverwaltungResource.java:49)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	java.lang.reflect.Method.invoke(Method.java:597)
	com.sun.jersey.impl.model.method.dispatch.EntityParamDispatchProvider$TypeOutInvoker._dispatch(EntityParamDispatchProvider.java:131)
	com.sun.jersey.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:80)
	com.sun.jersey.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:133)
	com.sun.jersey.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:111)
	com.sun.jersey.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:71)
	com.sun.jersey.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:111)
	com.sun.jersey.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:64)
	com.sun.jersey.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:616)
	com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:180)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)


note The full stack trace of the root cause is available in the Apache Tomcat/6.0.16 logs.


--------------------------------------------------------------------------------

Apache Tomcat/6.0.16
 
Hm, das sieht irgendwie aus, als wollte jemand JPA, könne es aber nicht wirklich. Dieses HskaUtils sieht arg unteriirdisch aus: alles statische Methoden, eine Schnittstelle die dazu einlädt Bugs ohne Ende einzubauen, null Testbarkeit usw. usw. Sorry, dass ich das so verreißen muss, aber das sieht wirklich aus wie alles ineinander werfen und stark umrühren und dann "Finde den Fehler!".

Resourcenhandling mit static ist grundfoo. Ein EntityManager ist NICHT Threadsafe, den kann man nich einfach in einer static Variable halten. Habe ich schon erwähnt das static eher ungünstig ist? ;) Dann wirfst du Hibernate und JPA durcheinander. Ich vermute es ist günstig sich im klaren darüber zu werden, was man wie (evtl. auch zusammen verwendet).

Nächste Frage: warum muss FahrzeugverwaltungImpl überhaupt HskaUtil nach einem EntityManager fragen? Den könntest du ihr doch schon geben, nachdem du sie Instantiierst (in getFahrzeugverwaltung()).

Zu deinem eigentlichen Fehler: liegt die persistence.xml wirklich im Classpath unter META-INF/persistence.xml?

Gruß
Ollie
 
Danke Ollie, ja genau das mit dem persistence.xml war das Problem. Naja die HskaUtil ist nicht von mir geschrieben, sie ist vorgegeben vom Dozenten, wir sollen sie nutzen. :)
 
Ja ich studiere an der Uni Mannheim, das ist nicht direkt mein Projekt, ich helfe jemandem aus einer anderen Hochschule aus einer anderen Stadt. ;)
 
Zurück