PersistenceContext Injection für alle!

Datenpersistierung mit e4 und Gemini JPA

Nepomuk Seiler

Eclipse Magazin

Der Artikel „PersistenceContext Injection für alle!“ von Nepomuk Seiler ist erstmalig erschienen im

Eclipse Magazin 4.2012

Dependency Injection

Aktuell ist vom Gemini-Projekt keine Dependency-Injection-Erweiterung geplant. Allerdings ist von der Community [6] ein Bundle implementiert worden, das dieses Feature nachrüstet. Es ist geplant, diese Erweiterung in den nächsten Milestone zu integrieren. Implementierung und Anwendung sind simpel gehalten. Dank der einfachen Möglichkeit, von e4 die @Inject-Annotation mit eigenen Annotationen zu erweitern, gibt es die Möglichkeit, über die @GeminiPersistenceContext- oder @GeminiPersistenceUnit-Annotation entweder einen EntityManager oder eine EntityManagerFactory zu injizieren. Dabei können neben dem PU-Namen auch zusätzliche Properties mit übergeben werden, um die PU dynamisch zu konfigurieren (Listing 3). Diese Properties können entweder statisch gesetzt oder aus dem Eclipse IPreferenceStore entnommen werden.

Listing 3

import static org.eclipse.persistence.config.PersistenceUnitProperties.*;
@Inject
@GeminiPersistenceContext(unitName = "contacts", properties = {
 @GeminiPersistenceProperty(name=JDBC_DRIVER, value = "com.mysql.jdbc.Driver"),
 @GeminiPersistenceProperty(name=JDBC_URL, valuePref=@Preference(value="jdbc_url"))
})
private EntityManager em;
Eine Multidatenbank-Anwendung

Die vorgestellten Techniken werden an einer kleinen e4-Beispielanwendung demonstriert. Die Anwendung soll

  • mehrere Datenbanken mit demselben Modell anbinden
  • Datenbankverbindungen über Annotations konfigurieren
  • einfache CRUD-Funktionen bereitstellen

    Bevor man loslegt, werden folgenden Produkte benötigt:

  • Eclipse 4.2M6
  • EclipseLink 2.3.0 oder höher
  • Eclipse Gemini JPA 1.0.0
  • Eclipse Gemini DBAccess 1.0.0
  • Eclipse Gemini DI Extension [7]

Alle Bundles sollten zur aktiven Target Platform hinzugefügt werden. EclipseLink kann auch über das Eclipse Juni p2 Repository installiert werden. Zuerst wird die e4-Beispielanwendung über den New Wizard mit Bundlename com.example.rcp erstellt. Die erstellte Anwendung erhält eine Produktkonfiguration, die testweise gestartet werden sollte. Eine detailliertere Beschreibung zur Entwicklung von e4-Anwendungen findet sich unter http://www.vogella.de.

Als Nächstes erstellt man ein Plug-in com.example.entity, das die persistence.xml und alle Entitäts-Klassen enthält. Die Beispielanwendung soll eine simple Kontaktverwaltung bereitstellen, in der Personen, Städte und Länder eingetragen werden können. Die persistence.xml ist in Listing 4 abgebildet, dabei wird Apache Derby mit EmbeddedDriver als Standarddatenbank verwendet. In der MANIFEST.MF müssen die Häkchen „activate when one of its classes is loaded“ und „Plugin is a singleton“ gesetzt sein. In der MANIFEST.MF wird folgender Eintrag hinzugefügt: Meta-Persistence: META-INF/persistence.xml, damit das Bundle als Persistence Bundle von Gemini JPA erkannt wird. Nicht vergessen, das Package mit den Entitäts-Klassen zu exportieren!

Listing 4

org.eclipse.persistence.jpa.PersistenceProvidercom.example.entity.Countrycom.example.entity.Citycom.example.entity.Persontrue

Im nächsten Schritt wird die Produktkonfiguration um die nötigen Bundles und Startkonfigurationen erweitert. Für Gemini JPA, Derby und EclipseLink sind folgenden Bundles notwendig:

  • org.eclipse.persistence.jpa
  • org.eclipse.persistence.core
  • org.eclipse.persistence.antlr
  • org.eclipse.persistence.asm
  • org.apache.derby
  • org.eclipse.gemini.jpa
  • org.eclipse.gemini.dbaccess
  • org.osgi.enterprise
  • org.eclipse.gemini.ext.di
  • com.example.entity

Der Startlevel und das Startverhalten können in der Produktkonfiguration im Reiter CONFIGURATION eingestellt werden und sollten wie in Abbildung 1 aussehen. Im Reiter LAUNCHING sollte ein zusätzliches VM-Argument mit angegeben werden: –DREFRESH_BUNDLES=false, um das Neustarten der Persistence Bundles durch Gemini JPA zu verhindern.

Abb. 1: Bundle-Startlevels in der Produktkonfiguration
Geschrieben von
Nepomuk Seiler
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.