# OpenJPA mit einem Java-SE-Projekt benutzen



## silentwater (16. Jul 2008)

Hallo,

ich habe ein JPA Utility Projekt erstellt, indem die JPA Klassen verwaltet werden. Da JPA prinzipiell aus unterschiedlichen Kontexten heraus verwendet werden kann (Servlets, Session Beans, Java SE Klassen), verwaltet dieses Projekt den EntityManager nicht selber, sondern dieser wird als Parameter von der darüberliegenden Schicht übergeben.

Von einem Webprojekt oder einer Session Beans lässt sich problemlos mittels dem JPA Utility Projekt auf die Datenbank zugreifen.

Nun will ich den Zugriff noch aus einem SE Projekt heraus realisieren. Als JPA Framework verwende ich OpenJPA. Leider konnte ich kein Tutorial finden, wie ich OpenJPA in einem Java-SE projekt integrieren kann. Meine ersten Versuche endeten mit einer 
  java.lang.NoClassDefFoundError: org.apache.commons.collections.set.MapBackedSet
beim Aufruf der Methode
  EntityManagerFactory emf = Persistence.createEntityManagerFactory("MyPU");

Weiß jemand ein gutes Tutorial das beschreibt, wie man aus einem Java SE Projekt heraus JPA verwenden kann? Insebsondere ist interessant:

- Welche Bibliotheken eingebudnen werden müssen
- Werden Spezielle Parameter in der Runtime Configuration benötigt?
- Kann eine Datenbank direkt angebunden werden, oder muss das über einen Server laufen?


Als Tool verwende ich RAD oder Eclipse Ganymede.

Schon mal herzlichen Dank


----------



## byte (16. Jul 2008)

OpenJPA kenne ich nicht, aber o.g. Exception lässt sich doch ohne weiteres fixen, indem Du Apache Commons Collections in den Classpath einfügst. Es ist nicht ungewöhnlich, dass JPA-Implementierungen diverse externe Libs verwenden - ist bei Hibernate genauso. Für gewöhnlich werden diese Libs mitgeliefert und müssen nur eingebunden werden.


----------



## silentwater (16. Jul 2008)

Vielen Dank, das hat mich schon mal sehr viel weitergebracht .....

Nun habe ich diesbezüglich aber noch ein Problem. beim Starten wird die Fehlermedlung geworfen:



> <openjpa-1.2.0-SNAPSHOT-r422266:661498 fatal user error> org.apache.openjpa.persistence.ArgumentException: Es muss der Name eines JDBC-Treibers oder einer DataSource-Klasse in der Eigenschaft ConnectionDriverName angegeben werden.



Dabei habe ich den Treiber genommen, der im OpenJPA manual empfohlen wird manual


```
<property name="openjpa.ConnectionDriverName" value="com.ibm.db2.jcc.DB2Driver" /></properties>
```

ich habe die Bibliotheken, die die Treiber enthalten jedoch eingebunden. Die Treiber würden sich mittels import com.ibm.db2.jcc.DB2Driver; einbinden lassen. Trotzdem wird der Treiber aus irgendwelchen gründen nicht als ein solcher erkannt.


----------



## Guest (16. Jul 2008)

Lass das </properties> weg.
Übrigens, alle nötigen Libraries mit Apache Commons etc. sind im lib Verzeichnis von OpenJPA enthalten.
Wenn du OpenJPA nicht innerhalb eines Server-Containers verwedest, brauchst du noch das hier beim 
Aufruf deiner Anwendung.

-javaagent:./lib/openjpa-1.1.0.jar


----------



## silentwater (17. Jul 2008)

Anonymous hat gesagt.:
			
		

> Lass das </properties> weg.



Alle <property> Elemente sind zusammen in dem <properties> Tag. Wurde nur ausversehen hier mit hereinkopiert.



			
				Anonymous hat gesagt.:
			
		

> Übrigens, alle nötigen Libraries mit Apache Commons etc. sind im lib Verzeichnis von OpenJPA enthalten.
> Wenn du OpenJPA nicht innerhalb eines Server-Containers verwedest, brauchst du noch das hier beim
> Aufruf deiner Anwendung.
> 
> -javaagent:./lib/openjpa-1.1.0.jar



Leider hat dies nicht das Problem geändert, die Fehlermeldung ist nach wie vor die gleiche. 


> Exception in thread "main" <openjpa-1.1.0-r422266:657916 fatal user error> org.apache.openjpa.persistence.ArgumentException: A JDBC Driver or DataSource class name must be specified in the ConnectionDriverName property.



In den Zeilen vor dem Fehler steht 


> 31  WARN   [main] openjpa.Runtime - The configuration property named "openjpa.Id" was not recognized and will be ignored, although the name closely matches a valid property called "openjpa.Id".
> 93  INFO   [main] openjpa.Runtime - Starting OpenJPA 1.1.0


[/quote]


----------



## Guest (17. Jul 2008)

Vielleicht irgendwo ein fehlendes schliessendes / oder sowas. Lass mal den Validator für XML laufen.

Hast du wirklich die richtige Jar-Datei mit dem JDBC-Treiber eingebunden?
Prüfe auch die Schreibweise: com.ibm.db2.jcc.DB2Driver oder COM.ibm.db2.jcc.DB2Driver etc.

Versuche die Klasse in einem kleinen Test mit
	
	
	
	





```
Class.forName("com.ibm.db2.jcc.DB2Driver");
```
zu laden.
Mit DB2 habe ich bisher nichts zu tun gehabt, aber der Test sollte zeigen, ob die Klasse auch geladen 
werden kann. Vielleicht kann die Klasse des Treibers nicht geladen werden, weil noch irgendwelche
zusätzlichen Jar-Dateien bzw. Klassen in Classpath fehlen? Die


----------

