JPA in Kommandozeilenprogramm benutzen

JanHH

Top Contributor
Hallo,

ich stehe vor der Aufgabe, eine Datenbank per JPA mittels eines Kommandozeilentools (also quasi Java SE, sehr abgespeckt) anzusprechen. Allerdings will es nicht so ganz. Dummerweise gehört die Konfiguration eines Projektes (Eclipse) nicht gerade zu meinen Stärken, vielleicht fehlt da einfach irgendwas?

Also, ich habe hibernate heruntergeladen (aktuelle Version, 3.5.3 final). In meiner Anwendung parallel zum src-Ordner einen lib-Ordner angelegt, dorthin kopiert:

antlr-2.7.6.jar
commons-collections-3.1.jar
dom4j-1.6.1.jar
javassist-3.9.0.GA.jar
jta-1.1.jar
slf4j-api-1.5.8.jar

(aus dem "required"-ordner der Hibernate-Distribution)

sowie

postgresql-8.4-701.jdbc3.jar
hibernate-jpa-2.0-api-1.0.0.Final.jar.

Innerhalb des src-Ordners parallel zum Source-Package einen Ordner META-INF angelegt, dorthin die (eigentlich korrekte) persistence.xml kopiert.

Naja und dann meinen Java-Code geschrieben und ausgeführt:
Java:
EntityManagerFactory emf=Persistence.createEntityManagerFactory("meinePersistenzUnit");
EntityManager em=emf.createEntityManager();
em.getTransaction().begin();

Allerdings führt schon die erste Zeile zu einer Exception:


javax.persistence.PersistenceException: No Persistence provider for EntityManager named meinePersistenzUnit
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:32)

tja, was mag da falsch sein? Ich vermute, irgendwas an der Projektkonfiguration stimmt nicht, so dass die persistence.xml nicht gefunden wird.. aber keine Ahnung ob das wirklich so ist, oder wie ich das heraus finde ;-).

Gruß+Danke
Jan
 
G

Gelöschtes Mitglied 5909

Gast
probiers mal unter /META-INF und nicht /src/META-INF

hast du einen provider in der xml angegeben?
 
Zuletzt bearbeitet von einem Moderator:

JanHH

Top Contributor
Eigentlich schon, ja. Also meine Klassen sind im packe a.b.c. Im jar sind:

META-INF
a

und in META-INF ist die persistence.xml, in a ist b.

Die persistence.xml ist in Ordnung, hat in der gleichen Form in einem anderen Projekt funktioniert.
 

musiKk

Top Contributor
Also um sicher zu gehen, dass das auch stimmt, habe ichs nochmal getestet und das muss so funktionieren. Die Fehlermeldung, die Du am Anfang erhalten hast, deutet ja nicht darauf hin, dass die persistence.xml nicht gefunden wurde, sondern dass kein persistence provider gefunden wurde. Das kann viele Gründe haben: z. B. Schreibfehler in der persistence.xml oder der gewünschte persistence provider ist nicht im classpath. Das Resultat dabei ist immer das gleiche, darum ist die Fehlermeldung nicht aussagekräftiger.

Eigentlich schon, ja.

Was heißt eigentlich ja? Vielleicht auch nicht?
 

JanHH

Top Contributor
Eigentlich eine gute Frage ;-).

Kommt nicht, wenn man die persistence.xml-Datei entfernt, genau die gleiche Fehlermeldung? Hatte bei meinen Tests diesen Eindruck..
 

musiKk

Top Contributor
Ja, das sagte (oder zumindest meinte) ich auch. Es ging mir nur darum, dass es nicht daran liegen muss, dass die persistence.xml nicht gefunden wird (wie im ersten Post vermutet), sondern auch am classpath oder dem Inhalt der persistence.xml liegen kann.
 

JanHH

Top Contributor
Aber irgendwie bin ich immer noch nicht schlauer ;-). Naja, immerhin gut zu wissen dass es so gehen müsste.

Vielleicht hat es was mit der Art, wie es aufgerufen wird, zu tun? Also ich habe ein meinjar.jar, darin gibts ein package a.b, in dem Packge gibts eine MyClass mit einer Main-Methode. Ausserdem gibts da wie gesagt das Meta-Inf verzeichnis mit der persistence.xml.

Der Aufruf ist ganz simpel "java -cp meinjar.jar a.b.MyClass". Und dann kommt diese Meldung.

Die Klassen für Hibernate und jdbc-Treiber habe ich testweise einfach ganz platt ins jre/lib/ext-Verzeichnis kopiert.
 

JanHH

Top Contributor
Also eigentlich frage ich mich.. kann man das "einfach so" aufrufen, per Kommandozeile, ein class-File mit einer main-Methode innerhalb eines jars, oder muss das noch irgendwie anderweitig "als JPA-Projekt konfiguriert" sein, damit das funktioniert? Weiss das jemand?
 

musiKk

Top Contributor
Nein, muss es nicht. Das ist eine ganz normale Anwendung. Die main wird automatisch aufgerufen (liegt in der Natur der Sache, weil sie der Startpunkt eines jeden Programms ist) und gesonderte Projektdefinitionen gibt es diesbezüglich zur Laufzeit auch nicht. Fehler in der Struktur hätten außerdem schon zu ganz anderen Exceptions geführt.

Bist Du Dir hundertprozentig sicher, dass die benotigten JARs im classpath liegen? Du kannst ja mal bevor die [c]EntityManagerFactory[/c] erzeugt wird, ein paar wichtige Klassen mit [c]Class.forName()[/c] laden. Wenn das durchläuft, sind die Klassen bekannt. Und was mir im Zuge dessen auch noch auffällt: Zu einem slf4j-api-x.x.x.jar gehört meines Wissens auch immer eine Implementierung (z. B. slf4j-log4j12-x.x.x.jar für log4j).
 

JanHH

Top Contributor
Danke für die Tipps. Ich hab die aktuelle hibernate-distribution heruntergeladen (hibernate-distribution-3.5.3-Final), da gibts dann ein Verzeichnis "lib", dort je einen Ordner "jpa" (dort ist die hibernate-xyz.jar) und einen Ordner "required" (wo der ganze andere Kram drin war). Ich fand es logisch, nun genau all diese jars zu nehmen und dazu noch den jdbc-Treiber. Naja, bin die letzten Tage nicht dazu gekommen, aber werd mir das demnächst noch mal im Detail vornehmen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S OpenJPA mit einem Java-SE-Projekt benutzen Data Tier 5

Ähnliche Java Themen

Neue Themen


Oben