Java Persistence API 2: Unterschied zwischen den Versionen

Aus Alexander's Wiki
Zeile 45: Zeile 45:


'''Problematisch ist die Verwendung einer Generatorart, die vom Datenbanksystem nicht unterstützt wird, z.B. bei Oracle IDENTITY'''
'''Problematisch ist die Verwendung einer Generatorart, die vom Datenbanksystem nicht unterstützt wird, z.B. bei Oracle IDENTITY'''
=== Table-Generatoren ===
<source lang="java5">
  @Id
  @GeneratedValue(strategy = GenerationType.TABLE)
  private String id;
</source>


== Entity-Manager ==
== Entity-Manager ==

Version vom 15. April 2013, 22:09 Uhr

JPA ist eine Spezifikation, die von einem JPA-Provider implementiert werden muss. Die bekanntesten sind:

Entitäten

Die Annotation @Entity macht aus der gewöhnlichen, nicht persistenten Java-Klasse eine persistente Entity. Die Instanzvariable id ist mit @Id annotiert und wird damit von JPA als Primärschlüsselvariable verwendet. Ohne weitere Annotation muss die Anwendung dafür Sorge tragen, dass die Entity vor dem Persistieren mit einem gültigen, also noch nicht vergebenen Primärschlüssel versorgt wird.

import javax.persistence.*;

@Entity
public class DemoKlasse {

  @Id
  private String id;
  private String param;

  public DemoKlasse() {
     // Hibernate und OpenJPA bieten eigene Generatoren an
     this.id = UUID.randomUUID().toString();
  }

  public DemoKlasse(String param) {
     this();
     this.param = param;
  }

}

Die Generierung des Primärschlüssel kann auch automatisch erfolgen. Dazu wird die Annotation @GeneratedValue gefolgt von einer der vier möglichen Strategien verwendet:

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private String id;
AUTO Überlässt der JPA-Implementierung die Wahl des Verfahrens, i.d.R. IDENTITY oder SEQUENCE. Die Wahl ist sowohl provider- als auch datenbankabhängig.
IDENTITY Verwendet die Datenbankfunktionalität einer selbstinkrementierenden Spalte.
TABLE Verwendet eine zusätzliche Tabelle zur Verwaltung des zuletzt generierten Primärschlüssels.
SEQUENCE Verwendet die Datenbankfunktionalität einer Sequence.

Problematisch ist die Verwendung einer Generatorart, die vom Datenbanksystem nicht unterstützt wird, z.B. bei Oracle IDENTITY

Table-Generatoren

  @Id
  @GeneratedValue(strategy = GenerationType.TABLE)
  private String id;


Entity-Manager

Die zentrale Einheit zur Verwaltung von Entitäten ist die Klasse EntityManager.

...

  EntitManager em = ...
  DemoKlasse demo = new DemoKlasse("Hallo");
  // Starten (und Sammeln in einer) Transaktion
  em.getTransaction().begin();
  // Persistieren
  em.persist(demo);
    ...
  // Suchen
  kunde = em.find(DemoKlasse.class, primaerschluessel);
  // Ganze Tranzaktion abwickeln
  em.getTransaction().commit();

...


Quellen:

  1. [1] Hibernate JPA-Provider
  2. [2] EclipseLink Refernzimplementierung von JPA
  3. [3] OpenJPA JPA-Provider