OSGi und JPA

Nachfolgend wird das Zusammenspiel von OSGi und JPA kurz vorgestellt. Dabei werden wir Eclipse Equinox als OSGi und Eclipse Link als JPA Implementierung verwenden.  Als Datenbank kommt Apache Derby zum Einsatz.

Zunächst erstellen wir ein neues Bundle (Eclipse Plugin Projekt) und nennen es „JPATest“. Dann passen wir die Manifest.MF an.

Manifest-Version: 1.0
Meta-Persistence: META-INF/persistence.xml
JPA-PersistenceUnits: jpatest
Bundle-ManifestVersion: 2
Bundle-Name: JPATest
Bundle-SymbolicName: de.sambalmueslie.jpatest
Bundle-Version: 1.0.0.qualifier
Bundle-Vendor: Sambasoft
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Import-Package: javax.persistence;version="2.1.0",
 org.apache.derby.jdbc,
 org.osgi.framework;version="1.8.0"
Require-Bundle: javax.persistence;bundle-version="2.1.0",
 org.eclipse.persistence.jpa;bundle-version="2.5.2",
Bundle-Activator: de.sambalmueslie.jpatest.Activator

Hier sind folgende Einstellungen wichtig:

  • Meta-Persistence gibt den Pfad für die „persistence.xml“ an
  • JPA-PersistenceUnits gibt die Namen der PersistenceUnits aus der persistence.xml an
  • Import-Package
    • Hier müssen neben der javax.persistence auch das jdbc Package (in unserem Fall ist das org.apache.derby.jdbc) angegeben werden.
  • Require-Bundle
    • Wir benötigen die JPA Definition (javax.persistence) als auch die  auch die Umsetzung durch z.b EclipseLink jpa (org.eclipse.persistence.jpa)

Alles andere ist in der Manifest.MF wie gewohnt.

Als nächstes werden wir uns die persistence.xml anschauen.

<?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="jpatest" transaction-type="RESOURCE_LOCAL">
		<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
		<class>de.sambalmueslie.jpatest.DemoEntity</class>
		<exclude-unlisted-classes>true</exclude-unlisted-classes>
		<properties>
      		<!-- Common properties -->
      		<property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver"/>
      		<property name="javax.persistence.jdbc.url" value="jdbc:derby:memory:test-jpa;create=true"/>
      		<property name="javax.persistence.jdbc.user" value="APP"/>
      		<property name="javax.persistence.jdbc.password" value="APP"/>

      		<!-- EclipseLink specific properties -->
      		<property name="eclipselink.target-database" value="Derby"/>
      		<property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
      		<property name="eclipselink.debug" value="ALL"/>
      		<property name="eclipselink.weaving" value="static"/>
      		<property name="eclipselink.logging.level" value="INFO"/>
		</properties>

	</persistence-unit>
</persistence>

Hier gibt es nichts was man nicht von JPA schon so kennt. Es ist lediglich wichtig, dass aus dem Manifest der Name der JPA-PersistenceUnits der hier angegebenen PersistenceUnit enspricht.

Jetzt bleibt nur noch der Zugriff auf den EntityManager der nachfolgend dargestellt ist:

final PersistenceProvider p = new PersistenceProvider();
final Map<String, ClassLoader> map = new HashMap<>();
	map.put(PersistenceUnitProperties.CLASSLOADER, getClass().getClassLoader());
factory = p.createEntityManagerFactory("jpatest", map);

Damit hat man alles was man braucht um aus OSGi auf JPA zuzugreifen.
In der RunConfiguration von Eclipse müssen folgende Bundles gestartet werden:

  • javax.persistence
  • org.apache.derby
  • org.eclipse.persistence.antlr
  • org.eclipse.persistence.asm
  • org.eclipse.persistence.core
  • org.eclipse.persistence.jpa
  • org.eclipse.persistence.jpa.jpql

Wir eine andere Datenbank als Apache Derby verwendet dann muss diese anstelle von org.apache.derby geladen werden. Alle diese Abhängigkeiten finden sich in der hier beschriebenen Installation.

Schreib einen Kommentar