| Titel | Inhalt | Suchen | Index | DOC | Handbuch der Java-Programmierung, 7. Auflage |
| << | < | > | >> | API | Kapitel 47 - Objektorientierte Persistenz |
Nachdem die Java-Klasse Verzeichnis mit Metainformationen zur abgebildeten Tabelle ausgestattet und der Zugang zur Datenbank mit Hilfe des Persistenz Descriptor konfiguriert wurde, können wir die im Hintergrund arbeitende Datenbank im Grunde vergessen und uns ganz auf die Arbeit mit den Java-Klassen bzw. -Objekten konzentrieren. Die Transformation der Java-Operationen auf ihre SQL-Pendants und zurück übernimmt die Persistenzschicht, auf die wir mit Hilfe des EntityManager zugreifen können:
001 /* Listing4704.java */
002
003 import javax.persistence.*;
004
005 public class Listing4704
006 {
007 public static void main(String[] args)
008 {
009 //Erzeugen einer EntityManagerFactory mit Hilfe des symbolischen
010 //Namens aus dem Persistenz Descriptor (persistence.xml)
011 EntityManagerFactory emf =
012 Persistence.createEntityManagerFactory("persistenceExample");
013
014 //Erzeugen eines EntityManagers für den Zugriff auf
015 //die Datenbank
016 EntityManager manager = emf.createEntityManager();
017
018 //An dieser Stelle können Sie mit Hilfe des EntityManagers auf
019 //die Datenbank zugreifen
020
021 //Freigabe der Ressourcen des EntityManagers
022 manager.close();
023
024 //Schließen der EntityManagerFactory und Freigeben der
025 //belegten Ressourcen
026 emf.close();
027 }
028 }
|
Listing4704.java |
Zunächst erzeugen wir eine EntityManagerFactory, die dazu verwendet wird, einen EntityManager zu erzeugen. Hierfür verwenden wir in Zeile 012 den symbolischen Namen des Persistenz Descriptor aus Zeile 007 des Listing 47.3. Ist der EntityManager erzeugt, können wir mit seiner Hilfe nun alle lesenden und schreibenden Operationen auf der Datenbank ausführen. Da sowohl der EntityManager als auch die EntityManagerFactory auf die Datenbank zugreifen und Ressourcen belegen, müssen wir diese am Ende eines Programms durch Aufruf von close zurückgeben.
Das Java Persistenz API gestattet Datenbankzugriffe nur innerhalb von Transaktionen (siehe auch Abschnitt 44.4.3) - selbst wenn diese nur lesend sind. Derartige Datenbanktransaktionen lassen sich mit dem EntityManager jedoch leicht realisieren, indem wir eine EntityTransaction erzeugen und mit der Methode begin starten. Alle folgenden Zugriffe und Manipulationen erfolgen dann so lange innerhalb der Transaktion, bis diese durch Aufruf der Methode commit abgeschlossen oder via rollback zurückgesetzt wird.
001 /* Listing4705.java */
002
003 import javax.persistence.*;
004
005 public class Listing4705
006 {
007 public static void main(String[] args)
008 {
009 //Erzeugen einer EntityManagerFactory mit Hilfe des symbolischen
010 //Namens aus dem Persistenz Descriptor (persistence.xml)
011 EntityManagerFactory emf =
012 Persistence.createEntityManagerFactory("persistenceExample");
013
014 //Erzeugen eines EntityManagers für den Zugriff auf
015 //die Datenbank
016 EntityManager manager = emf.createEntityManager();
017
018 //Beginn einer neuen Transanktion
019 EntityTransaction tx = manager.getTransaction();
020 tx.begin();
021
022 //An dieser Stelle können Sie mit Hilfe des EntityManagers auf
023 //die Datenbank zugreifen
024
025 //Abschluss der Transaktion mit einem Commit
026 tx.commit();
027
028 //Freigabe der Ressourcen des EntityManagers
029 manager.close();
030
031 //Schließen der EntityManagerFactory und Freigeben der
032 //belegten Ressourcen
033 emf.close();
034 }
035 }
|
Listing4705.java |
Das Anlegen eines neuen Datensatzes haben wir in Listing 44.5 im JDBC-Kapitel mit Hilfe eines INSERT-Statements realisiert. Bei Verwendung des Java Persistenz API verwenden wir den Konstruktor der Klasse Verzeichnis, um ein neues Java-Objekt zu erzeugen, und speichern es anschließend mit Hilfe der Methode persist des EntityManager ab. Die einzelnen Member-Variablen haben wir zuvor durch Aufruf der Setter-Methoden gesetzt.
Wie man sieht, reichen die Anweisungen von Zeile 023 bis Zeile 028, um einen neuen Datensatz anzulegen. Wir benötigen keinerlei Wissen über die im Hintergrund arbeitende Datenbank und müssen auch keinerlei SQL-Kommandos formulieren. All diese Details nimmt uns das Persistenz API ab.
Nachdem wir den Datensatz in der Datenbank gespeichert haben, möchten wir ihn nun auch wieder aus dieser laden können. Dafür können wir beispielsweise die Methode find des EntityManager verwenden:
001 /* Listing4707.java */
002
003 import javax.persistence.*;
004
005 public class Listing4707
006 {
007 public static void main(String[] args)
008 {
009 //Erzeugen einer EntityManagerFactory mit Hilfe des symbolischen
010 //Namens aus dem Persistenz Descriptor (persistence.xml)
011 EntityManagerFactory emf =
012 Persistence.createEntityManagerFactory("persistenceExample");
013
014 //Erzeugen eines EntityManagers für den Zugriff auf
015 //die Datenbank
016 EntityManager manager = emf.createEntityManager();
017
018 //Beginn einer neuen Transanktion
019 EntityTransaction tx = manager.getTransaction();
020 tx.begin();
021
022 //Laden des Verzeichnis-Objekts mit der Id=0
023 Verzeichnis dir = manager.find(Verzeichnis.class, 0);
024
025 //Ausgabe des gefundenen Objekts
026 System.out.println(dir);
027
028 //Abschluss der Transaktion mit einem Commit
029 tx.commit();
030
031 //Freigabe der Ressourcen des EntityManagers
032 manager.close();
033
034 //Schließen der EntityManagerFactory und Freigeben der
035 //belegten Ressourcen
036 emf.close();
037 }
038 }
|
Listing4707.java |
Statt das Java-Objekt selbst zu erzeugen, rufen wir find auf, um den Datensatz aus der Datenbank zu laden. find erhält als ersten Parameter die gesuchte Klasse und als zweiten Parameter den eindeutigen Schlüssel des zu ladenden Datensatzes (in diesem Fall die Nummer 0).
Der EntityManager wird nun ein entsprechendes SELECT-Statement formulieren und versuchen, den Datensatz aus der Tabelle dir auszulesen. Findet er den gesuchten Datensatz, liefert er ihn als Objekt der Klasse Verzeichnis zurück, andernfalls ist der Rückgabewert null. Wir werden später Möglichkeiten kennenlernen, mit denen Datensätze nicht nur nach ID, sondern nach beliebigen Kriterien gesucht werden können.
Um einen Satz aus der Datenbank zu löschen, bietet der EntityManager die Methode remove:
001 /* Listing4708.java */
002
003 import javax.persistence.*;
004
005 public class Listing4708
006 {
007 public static void main(String[] args)
008 {
009 //Erzeugen einer EntityManagerFactory mit Hilfe des symbolischen
010 //Namens aus dem Persistenz Descriptor (persistence.xml)
011 EntityManagerFactory emf =
012 Persistence.createEntityManagerFactory("persistenceExample");
013
014 //Erzeugen eines EntityManagers für den Zugriff auf
015 //die Datenbank
016 EntityManager manager = emf.createEntityManager();
017
018 //Beginn einer neuen Transanktion
019 EntityTransaction tx = manager.getTransaction();
020 tx.begin();
021
022 //Laden des Verzeichnis-Objekts mit der Id=0
023 Verzeichnis dir = manager.find(Verzeichnis.class, 0);
024
025 if (dir != null) {
026 //Löschen des Datensatzes aus der Datenbank
027 manager.remove(dir);
028 }
029
030 //Abschluss der Transaktion mit einem Commit
031 tx.commit();
032
033 //Freigabe der Ressourcen des EntityManagers
034 manager.close();
035
036 //Schließen der EntityManagerFactory und Freigeben der
037 //belegten Ressourcen
038 emf.close();
039 }
040 }
|
Listing4708.java |
| Titel | Inhalt | Suchen | Index | DOC | Handbuch der Java-Programmierung, 7. Auflage, Addison Wesley, Version 7.0 |
| << | < | > | >> | API | © 1998, 2011 Guido Krüger & Heiko Hansen, http://www.javabuch.de |