# Tomcat 7, Struts, JPA baut keine Verbindung auf



## Stephan.Woebbeking (10. Feb 2011)

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:

```
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:

```
<!--<?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:

```
<?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


----------



## MySelV (10. Feb 2011)

Hi,

same as here:
http://www.java-forum.org/data-tier/113312-eclipselink.html

Grüße
Erik


----------



## Stephan.Woebbeking (10. Feb 2011)

Daraufhin habe ich meine persistence.xml erweitert:

```
<!--<?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?


----------



## MySelV (10. Feb 2011)

Hi,

eigentlich gehört es in den Ordner META-INF/persistence.xml. Wenn es daran nicht liegt, kann es noch die Abhängigkeit zu einer fehlenden .jar (für den Provider) liegen.

Siehe auch: blog.m1key.me: No Persistence provider for EntityManager named X

Grüße


----------



## Stephan.Woebbeking (10. Feb 2011)

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


----------



## MySelV (10. Feb 2011)

Hi,

hmm hast du die beiden Jars von Punkt 2 hier: JPA 2.0 with EclipseLink - Tutorial in deinem Classpath? Speziell auch im WEB-INF/libs Verzeichnis damit der ApplicationServer die auch kennt?

Grüße
Erik


----------



## Stephan.Woebbeking (10. Feb 2011)

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?


----------



## MySelV (10. Feb 2011)

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


----------



## Stephan.Woebbeking (10. Feb 2011)

Es gibt in javax.persistense.Persistence einen static String PERSISTENCE_PROVIDER, der enthält "javax.persistence.spi.PeristenceProvider", hat das etwas zu bedeuten?


----------



## Stephan.Woebbeking (10. Feb 2011)

Hoi, ich nochmal... Bisher habe ich immer noch mit

```
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory( "testjpa" );
```
gearbeitet, jetzt hab ich mal im Nebel gestochert (muss man tatsächlich so sagen):

```
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...


----------



## Stephan.Woebbeking (10. Feb 2011)

Hmmm, hat natürlich nischt geholfen, die factory wird dort mit null zurück geliefert, auch nicht viel besser als die Exception... :-(


----------



## Stephan.Woebbeking (11. Feb 2011)

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...


----------



## mvitz (12. Feb 2011)

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


----------



## Stephan.Woebbeking (14. Feb 2011)

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...


----------

