Mit JPA in einem anderen Bundle auf Daten zugreifen

Informationen zu diesem Vorgang

Sie müssen Ihr JPA-Bundle konfigurieren und die Datenquellen zu WebSphere Application Server hinzufügen, um auf JPA-Persistenzeinheiten eines anderen Bundles zugreifen zu können, z. B. eines Webanwendungsbundles, das JPA-Entitäten konsumiert und Daten anzeigt bzw. bearbeitet.
Tipp:

Stellen Sie sicher, dass Ihre JPA-Persistenzdatei Referenzen auf eine JTA-Datenquelle (Java™ Transaction API) und eine Nicht-JTA-Datenquelle enthält.

In JPA gibt es zwei transaktionsorientierte Muster für den Zugriff auf eine Datenquelle:
jta-data-source
Das Muster für JTA-Ressourcen (Java Transaction API) hängt von globalen Transaktionen ab. Das JTA-Ressourcenmuster wird in der Regel im Geltungsbereich einer EJB-Sitzungsfassade (Enterprise JavaBeans) eingesetzt. Bei dieser Konfiguration kann die Session-Bean den Transaktions- und Sicherheitskontext steuern, während JPA die Persistenzzuordnungen durchführt. In diesem Fall verwendet die Anwendung nicht die Schnittstelle EntityTransaction, sondern greift auf den für die globale Transaktion registrierten EntityManager zurück.
non-jta-data-source
Das Muster für Nicht-JTA-Ressourcen wird für eine Einzelressource verwendet, wenn keine globalen Transaktionen vorliegen. Das Nicht-JTA-Ressourcenmuster wird in der Regel im Geltungsbereich einer Webanwendung oder eines Anwendungsclients eingesetzt. Die Anwendung steuert die Transaktion mit der Datenquelle über die Schnittstelle EntityTransaction.

In persistence.xml-Dateien für eine OSGi-Anwendung greifen die Elemente jta-data-source und non-jta-data-source mit einer JNDI-Suche (Java Naming and Directory Interface), einer JNDI-Suche in der Service-Registry oder über Blueprint auf die Datenquellen zu.

Wenn die JTA- und Nicht-JTA-Datenquellen nicht in der Datei persistence.xml konfiguriert sind, werden die für den Server konfigurierten JTA- und Nicht-JTA-Standarddatenquellen verwendet. Der Standardwert ist jeweils null. Einige Features für JPA-Entitäten erfordern, dass eine Nicht-JTA-Datenquelle angegeben ist. Dies ist beispielsweise bei der automatischen ID-Generierung für Entitäten der Fall.

Vorgehensweise

  1. Stellen Sie sicher, dass das Entitätenpaket und das Entitätscontrollerpaket als Exportpakete zu manifest.mf hinzugefügt wurden.
    1. Klicken Sie doppelt auf Manifest: <Projektname>. Hier steht <Projektname> für den Namen Ihres JPA-Bundleprojekts. Das Bundlemanifest wird im Editor geöffnet.
    2. Wechseln Sie zur Registerkarte "Laufzeit". Vergewissern Sie sich, dass das Entitätenpaket und das Entitätscontrollerpaket als Exportpakete hinzugefügt wurden.
  2. Fügen Sie wie folgt Nicht-JTA-Datenquellen zu persistence.xml hinzu:
    1. Öffnen Sie persistence.xml im Editor.
    2. Wählen Sie in der Komponentenliste Ihre Entität aus, um die Details der Entität anzuzeigen.
    3. Geben Sie im Feld für die Nicht-JTA-Datenquelle den globalen JNDI-Namen einer solchen Datenquelle ein, z. B. osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/blogdbnojta).
  3. Modifizieren Sie die Methode getEntityManager().

    Durch das Modifizieren der Methode getEntityManager() konfigurieren Sie die JNDI-Suche für den Service EntityManagerFactory, da sich die Persistenzeinheit eines JPA-Bundles nicht in einer Java-EE-Umgebung befindet.

    Sie können die JNDI-Suche auch konfigurieren, indem Sie aus der Entitätsmanager-Bean eine mit Blueprint verwaltete Bean machen. Weitere Informationen finden Sie unter JPA und OSGi Applications.

    1. Öffnen Sie die Entitätsmanager-Bean im Editor.
    2. Suchen Sie getEntityManager() und modifizieren Sie die Methode wie folgt:
      private EntityManager getEntityManager() {
      		try {
      			emf = (EntityManagerFactory) new InitialContext().lookup("osgi:service/javax.persistence.EntityManagerFactory/(osgi.unit.name=jpaBundle)");
      		} catch (NamingException e) {
      			// TODO Automatisch generierter Catch-Block
      			e.printStackTrace();
      		}
      		
      		return emf.createEntityManager();
      	}
      Wichtig: Stellen Sie sicher, dass die Persistenzeinheit in der folgenden Codezeile der Einheit in persistence.xml entspricht:
      emf = (EntityManagerFactory) new InitialContext().lookup("osgi:service/javax.persistence.EntityManagerFactory/(osgi.unit.name=jpaBundle)");
  4. Korrigieren Sie wie folgt generierte Fehler in InitialContext und NamingException:
    1. Wechseln Sie zur Ansicht "Markierungen".
    2. Klicken Sie mit der rechten Maustaste auf jeden Fehler und wählen Sie Schnellkorrektur aus. Befolgen Sie im Assistenten die Anweisungen für den Import der erforderlichen Pakete.
  5. Fügen sie wie folgt einen JDBC-Provider zur Administrationskonsole von WebSphere Application Server hinzu:
    1. Wechseln Sie zur Ansicht "Server".
    2. Klicken Sie mit der rechten Maustaste auf Ihre Serverinstanz und wählen Sie Start aus.
    3. Klicken Sie mit der rechten Maustaste auf Ihre Serverinstanz und wählen Sie Verwaltung > Administrationskonsole ausführen aus, um die Administrationskonsole zu öffnen.
    4. Klicken Sie auf Ressourcen > JDBC > JDBC-Provider.
    5. Klicken Sie auf der Seite "JDBC-Provider" auf Neu. Der Assistent "Datenquelle erstellen" wird geöffnet.
    6. Befolgen Sie im Assistenten die Anweisungen für die Erstellung eines JDBC-Providers.
    7. Speichern Sie die Änderungen.
  6. Fügen sie wie folgt Datenquellendefinitionen zur Administrationskonsole von WebSphere Application Server hinzu:
    1. Klicken Sie in der Administrationskonsole auf Ressourcen > JDBC > Datenquellen, um in der Konsole eine Datenquellenseite zu öffnen.
    2. Klicken Sie auf der Seite "Datenquellen" auf Neu, um eine Datenquellendefinition zu erstellen, deren JNDI-Name auf die in persistence.xml angegebene JTA-Verbindungsdefinition gesetzt ist, z. B. auf jdbc/blogdb.
    3. Klicken Sie auf der Seite "Datenquellen" auf Neu, um eine weitere Datenquellendefinition zu erstellen, deren JNDI-Name auf die in persistence.xml angegebene Nicht-JTA-Verbindungsdefinition gesetzt ist, z. B. auf jdbc/blogdbnojta.
    4. Klicken Sie nach dem Erstellen einer Datenquelle für die Nicht-JTA-Verbindung in der Administrationskonsole auf der Seite "Datenquellen" auf die Definition der Nicht-JTA-Verbindung. Die Seite Konfiguration wird geöffnet.
    5. Klicken Sie im Abschnitt "Weitere Eigenschaften" auf Eigenschaften für WebSphere-Datenquelle.
    6. Wählen Sie Nicht transaktionsorientierte Datenquelle aus. Wenn Sie im Anwendungsserver das Element <non-jta-data-source> verwenden, ist für eine nicht transaktionsorientierte Datenquelle eine spezielle Konfiguration erforderlich. Für den Anwendungsserver konfigurierte Datenquellen funktionieren nicht als <non-jta-data-source> (Nicht-JTA-Datenquelle), weil sie alle automatisch mit dem aktuellen Transaktionskontext registriert werden. Sie können diese automatische Registrierung verhindern, indem Sie eine angepasste Eigenschaft für eine weitere Datenquelle (nonTransactionalDataSource=true) hinzufügen.

Ergebnisse

Jetzt können Sie JPA-Entitäten konsumieren, JPA-Daten anzeigen und bearbeiten. Auf das JPA-Bundle wird dabei von einem Webanwendungsbundle zugegriffen.
Symbol das den Typ des Artikels anzeigt. Taskartikel
Nutzungsbedingungen für Information Center | Feedback

Symbol für Zeitmarke Letzte Aktualisierung: 29.04.2014

Dateiname: taccessjpaoutbundle.html