Samstag, 17. März 2012

JPA find() vs. getReference()

Wie werden Entitäten im Zustand persistent in JPA geladen/geholt?
Hierzu gibt es 2 Möglichkeiten neben diversen query-Methoden:

  • find()
  • getReference()
Wie werden beide genutzt?
- Find() wird auf dem EntityManager aufgerufen, die Methode erwartet 2 Parameter:
  1. Typ der angeforderten Entität
  2. Identität: Id der gefordeten Entität
Zurückgeliefert wird die gefundene Entität ohne null.
Beispiel:
EntityManagerFactory ef = Persistence.createEntityManagerFactory("myapp") ;
EntityManager em =  ef.createEntityManager();
....
Kunde k = em.find(Kunde.class, 70992);


- GetReference() wird ähnlich genutzt:
Kunde k = em.getReference(Kunde.class, 70922);
Falls die Entität mit der angegebenen Id nicht im Persistenzkontext vorliegt, wird eine EntityNotFoundException() geworfen.

Wodrin besteht der genaue Unterschied?
Bei find() wird die Entität aus dem Cache des Persistence-Context zurückgegeben oder wenn er nicht vorliegt aus der Datenbank geladen und zurückgegeben.
Bei getReference() wird die Entität erst einmal noch nicht geladen, sondern es wird ein Proxy(ein spezielles Objekt, so genanntes Stellvertreterobjekt mit angereicherten Methoden zum Nachladen der eigentlichen Entität) zurückgegeben - Realisierung über LazyLoading. Erst wenn auf konkrete Attribute zugegriffen wird oder andere Persistenzmethoden aufgerufen werden, greift der Proxy ein und lädt die konkrete Entität nach.

Wann sollte man welche Methode benutzen?
Die Nutzung von find() sollte nach Möglichkeit immer Vorrang vor query-Methode haben, da
find() geladene Entitäten aus dem Cache des Persistenz-Kontext zurückgeben kann.
Wenn man weiß, dass die Entität erst später konkret verwendet wird, ist die Nutzung von
getReference() anzuraten.

Keine Kommentare:

Kommentar veröffentlichen