Tomcat 7, Struts, JPA baut keine Verbindung auf

Hallo *,

ich versuche mich in die Idee des Web-Development einzuarbeiten. Ich habe Tomcat 7.0.8 am laufen und das ein oder andere auf Basis von struts funktioniert auch schon mal. Jetzt wollte ich JPA mit einbinden, als standalone klappt das auch, aber in der Web-Umgebung? Ich bekomme immer eine Exception aus meiner Applikation heraus:
Java:
javax.servlet.ServletException: javax.persistence.PersistenceException: No Persistence provider for EntityManager named testjpa
	org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:515)
	org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:419)

root cause

javax.persistence.PersistenceException: No Persistence provider for EntityManager named testjpa
	javax.persistence.Persistence.createEntityManagerFactory(Unknown Source)
	javax.persistence.Persistence.createEntityManagerFactory(Unknown Source)
	TestTomcat2.RegisterMailLHofcafe.isMailValid(RegisterMailLHofcafe.java:54)
	TestTomcat2.RegisterMailLHofcafe.execute(RegisterMailLHofcafe.java:39)
Nun weiß ich ja schonmal, dass er die Persistence-JAR schon gefunden hat, sonst bekomme ich eine andere Exception. Ich nehme an meine Konfiguration für JPA wird nicht geladen:
persistence.xml:
Java:
<!--<?xml version="1.0" encoding="UTF-8" ?>-->
<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_2_0.xsd"
	version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
	<persistence-unit name="testjpa" transaction-type="RESOURCE_LOCAL">
		<class>TestTomcat2.MailList</class>
		<properties>
			<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
			<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/test" />
			<property name="javax.persistence.jdbc.user" value="root" />
			<property name="javax.persistence.jdbc.password" value="abcDE123" />

			<!-- EclipseLink should create the database schema automatically -->
			<property name="eclipselink.ddl-generation" value="create-tables" />
			<property name="eclipselink.ddl-generation.output-mode" value="database" />

		</properties>
	</persistence-unit>
</persistence>
und orm.xml:
Java:
<?xml version="1.0" encoding="UTF-8" ?>
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"
    version="1.0">
    <description>Test register mailing list</description>
    <package>TestTomcat2</package>
    <entity class="TestTomcat2.RegisterMailLHofcafe" name="testjpa">
        <table name="MailList"/>
        <attributes>
            <id name="id">
                <generated-value strategy="TABLE"/>
            </id>
            <basic name="email">
                <column name="EMAIL" length="100"/>
            </basic>
            <basic name="key">
                <column length="255"/>
            </basic>
        </attributes>
    </entity>
</entity-mappings>
Beide Dateien liegen im WEB-INF Verzeichniss des Projektes, ich habe sie auch schon nach WEB-INF/classes geschoben und etliches ausprobiert, will aber trotzdem alles nicht.

Dabei gehe ich davon aus, dass ich die Lagerorte für die verschiedenen Dateien auch noch nicht ganz durchblickt habe. Kann hier jemand den Fehler erkennen und mir helfen?

Danke,
Stephan
 
Daraufhin habe ich meine persistence.xml erweitert:
Java:
<!--<?xml version="1.0" encoding="UTF-8" ?>-->
<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_2_0.xsd"
	version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
	<persistence-unit name="testjpa" transaction-type="RESOURCE_LOCAL">
		<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
		<class>TestTomcat2.MailList</class>
		<properties>
			<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
			<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/test" />
			<property name="javax.persistence.jdbc.user" value="root" />
			<property name="javax.persistence.jdbc.password" value="abcDE123" />

			<!-- EclipseLink should create the database schema automatically -->
			<property name="eclipselink.ddl-generation" value="create-tables" />
			<property name="eclipselink.ddl-generation.output-mode" value="database" />

		</properties>
	</persistence-unit>
</persistence>
Die Exception wie oben bleibt aber?!? Wo müssen denn die persistence.xml und die orm.xml liegen? Mittlerweile sind sie überall, aber wo wäre es richtig?
 
Hmm, ich muss zugeben, der Thread sagt mir überhaupt nichts... Sind diese Abhängigkeiten in irgendeiner Datei hinterlegt? Wie bekomme ich raus, wer mit wem zusammen arbeiten kann? Hast du ein paar Hinweise für mich?

Danke,
Stephan
 
Ich hatte die beiden jars im lib Verzeichnis von Tomcat. Hab das jetzt auch in den Classpath genommen, hilft aber nichts. Ich habe "eclipselink.jar" und "javax.persistence_2.0.1.v201006031150.jar" jetzt jeweils im lib von Tomcat liegen und im WEB-INF/lib vom Projekt. Im WEB-INF/lib/META-INF habe ich jetzt die persistence.xml und orm.xml liegen. Mittlerweile habe ich diese Dateien an so vielen Stellen liegen gehabt und dort wieder weggenommen dass ich mich frage, ob es nicht einen vernünftigen Weg gibt herauszubekommen, wo sie denn nun wirklich hingehören?
 
Hi,

der Ordner META-INF gehört aber auf dieselbe Ebene wie WEB-INF, nicht in den Ordner WEB-INF.
Ansonsten weiß ich auch nicht weiter.


Grüße
Erik
 
Hoi, ich nochmal... Bisher habe ich immer noch mit
Java:
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory( "testjpa" );
gearbeitet, jetzt hab ich mal im Nebel gestochert (muss man tatsächlich so sagen):
Java:
EntityManagerFactory entityManagerFactory = new org.eclipse.persistence.jpa.PersistenceProvider().createEntityManagerFactory( "testjpa", null );
Und siehe da, die Exception ist weg... Mal schauen wie es weiter geht, vielleicht kommt hier ja nochmal jemand vorbei der mir das erklären kann? Weil in der standalone application habe ich die obere Quelle verwendet...
 
FileMonitor hat weitergeholfen...
Die "persistence.xml" wurde allen Ernstes hier gesucht (TestTomcat2 ist das Projekt):
...\TestTomcat2\WEB-INF\classes\META-INF\persistence.xml

Kann mir das jetzt jemand erklären? Gibt es irgendwelche Regeln, welche Datei wo liegen muss oder muss ich mir das jedesmal ausdenken??? Muss doch irgendwo 'ne Doku geben, die ich noch nicht gefunden hab - was mir schwer fällt zu glauben...
 
Naja JPA (und damit auch Hibernate) sucht nun mal die persistence.xml im Classpath in einem Ordner META-INF. Da der Classpath für eine Webapp praktisch in WEB-INF/classes beginnt ergibt sich als richtiger Ordner: WEB-INF/classes/META-INF/persistence.xml
 
Tja, also ich hab mich ziemlich schwer getan diese Info zu finden... Wie so oft, wenn man es weiß scheint es auch ganz logisch, bei allen Beispielen die ich gelesen hab waren viele Pfade angegeben, aber der noch nicht...
 

Zurück
Oben