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

Die alte Launch Configuration sollte gelöscht und die Anwendung über die Produktkonfiguration gestartet werden. Je nach installierten Plug-ins kann der Start fehlschlagen. Das liegt dann an einer zu neuen Version von javax.persistence. Man ändert diese im Launch-Configuration-Dialog und nimmt die Version 2.0.3. Beispielhaft wird jetzt der CreatePersonHandler implementiert, der einen neuen Kontakt in der Datenbank speichert. Dazu implementiert man eine simple POJO-Klasse mit einer @Execute-Methode und injiziert einen EntityManager mit @Inject sowie @GeminiPersistenceContext(unitName=“contacts“) (Listing 5). Die restlichen Handler können analog implementiert werden, um die volle CRUD-Funktionalität bereitzustellen. Um die @Gemini* Annotations zu verwenden, importiert man das Bundle org.eclipse.gemini.ext.di.

Listing 5

public class CreatePersonHandler {
  
  @Inject
  @GeminiPersistenceContext(unitName="contacts")
  private EntityManager em;
  
  @Execute
  public void execute(@Named(IServiceConstants.ACTIVE_SHELL) Shell shell) {
    em.getTransaction().begin();
    Person person = new Person("Max", "Mustermann");
    em.persist(person);
    em.getTransaction().commit();
    em.clear();
  }
}
Datenbankenroulette

Die erste Version der Anwendung speichert alle Daten lokal in einer Apache-Derby-Datenbank. Nun soll es ermöglicht werden, zu einer zweiten Datenbank mit dem gleichen Modell zu wechseln, die auf einem Server liegt. Als Datenbank nutzen wir MySQL und die Gemini-DBAccess-MySQL-Erweiterung. Es sollten die folgenden drei Plug-ins in die Produktkonfiguration aufgenommen werden:

  • MySQL JDBC Driver
  • org.eclipse.gemini.dbaccess.mysql
  • org.eclipse.gemini.dbaccess.util

Nicht vergessen, die Startlevels für dbaccess.mysql auf „2“ zu setzen und autostart=true, damit die DataSourceFactory vor dem Start von Gemini JPA registriert wird. Für die Konfiguration der MySQL-Verbindung setzen wir URL, Treiber, User und Passwort direkt im Handler. Der GeminiPersistenceContext wird mit zusätzlichen Properties, wie in Listing 6 beschrieben, erweitert. Jetzt muss noch eine weitere PU erstellt werden. Dazu erzeugt man eine Datei persistence.mysql.xml im selben Ordner wie die erste persistence.xml. Dort werden alle Properties gelöscht. Die neue persistence.mysql.xml wird noch in der MANIFEST.MF in den Meta-Persistence Header eingetragen, sodass der Eintrag jetzt so aussieht:

Meta-Persistence: persistence.xml, persistence.mysql.xml
Listing 6

@Inject
@GeminiPersistenceContext(unitName = "contacts-mysql", properties = {
 @GeminiPersistenceProperty(name=JDBC_DRIVER, value="com.mysql.jdbc.Driver"),
 @GeminiPersistenceProperty(name=JDBC_URL, value="jdbc:mysql://127.0.0.1/contacts"),
 @GeminiPersistenceProperty(name=JDBC_USER, value="contact"),
 @GeminiPersistenceProperty(name=JDBC_PASSWORD, value="contact"),
 @GeminiPersistenceProperty(name=DDL_GENERATION, value=DROP_AND_CREATE),
 @GeminiPersistenceProperty(name=DDL_GENERATION_MODE, value=DDL_DATABASE_GENERATION) })
private EntityManager em;

Zuletzt bindet man den neuen Handler mit einem Command in dem UI ein und kann nun auf die MySQL-Datenbank zugreifen. Alternativ kann man die Properties auch über IEclipsePreferences setzen. Das com.example.rcp Bundle muss dazu zusätzlich das Package org.eclipse.e4.core.di.extensions importieren. Statt das value-Feld zu setzen, schreibt man

valuePref=@Preference(value="jdbc_driver")

Diese Anwendung kann nun auf beliebig viele Datenbanken und Schemata erweitert werden. Die gesamte Anwendung findet sich unter [8].

Fazit

Wenn man auf Features wie Weaving verzichten kann, ist die Nutzung von Gemini JPA sehr zu empfehlen. Die bessere Integration mit dem OSGi-Servicemodell und die Dependency-Injection-Erweiterung ermöglichen eine elegante RCP-Entwicklung, einfachen Zugriff auf mehrere Datenbanken und eine dynamischere Konfiguration der Verbindung. Damit kommt Java-EE6-Komfort auch in die Java-SE-Welt. Die Dependency-Injection-Erweiterung ist noch sehr jung und bisher wenig getestet – hier sind Early Adopter herzlich willkommen.

Nepomuk Seiler ist Student der Informatik an der LMU München. Er entwickelte im Rahmen seiner Bachelorarbeit Eclipse-RCP-Anwendungen und Frameworks, die auf aktuellsten Eclipse-Technologien basieren.
Geschrieben von
Nepomuk Seiler
Kommentare

Schreibe einen Kommentar

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