JPA, EntityManager pro Methode/ Klasse

Hallo zusammen :slight_smile:

Nach langer Zeit stelle ich auch mal wieder eine Frage :wink:

Ich habe folgende Klasse

 */

import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.TypedQuery;

public class Datenbankzugriff implements Datenzugriff {

  /* Konstante fuer Datenbank */
  public static final String DATABASE = "jdbc:ucanaccess://**********";

  /* Konstruktor */
  Datenbankzugriff() {
  }

  /* Systeme einlesen */
  @Override
  public List<System> readSystems() {

    /* ArrayList fuer Systeme */
    List<System> systems = new ArrayList<System>();

    /* EntityManager erzeugen */
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("schnittstellenDatenbankPU");
    EntityManager em = emf.createEntityManager();

    /* Systeme in ArrayList einlesen */
    TypedQuery<System> query = em.createQuery("SELECT s FROM Karte_Systeme s", System.class);
    List<System> results = query.getResultList();

    systems = results;

    /* EntityManager schließen */
    em.close();
    emf.close();

    return systems;
  }

  /* Schnittstellen einlesen */
  @Override
  public List<SingleInterface> readInterfaces() {

    /* ArrayList fuer Schnittstellen */
    List<SingleInterface> interfaces = new ArrayList<SingleInterface>();

    /* EntityManager erzeugen */
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("schnittstellenDatenbankPU");
    EntityManager em = emf.createEntityManager();

    /* Schnittstellen in ArrayList einlesen */
    TypedQuery<SingleInterface> query = em.createQuery("SELECT i FROM SingleInterface i",
            SingleInterface.class);
    List<SingleInterface> results = query.getResultList();

    interfaces = results;

    /* EntityManager schließen */
    em.close();
    emf.close();

    return interfaces;
  }
}```

Nun eröffne ich ja in jeder Methode einen neuen Entity Manager und schließe den jeweiligen in der entsprechenden Methode.

Gibt es eine Möglichkeit, dass ich nur einen Entity Manager verwende fĂŒr die ganze Klasse? Und wenn ja, an welcher Stelle eröffne ich ihn und schließe ihn wieder?

LG, droid :)

Du möchtest einen Entitymanager pro Klasse oder einen einen EntityManager fĂŒr die Klasse Datenbankzugriff?

In der Regel sollte man sich ĂŒber die Factory immer einen neuen EntityManager besorgen. Dieser sollte nicht (manuell) im Cache gehalten werden. Die Factory kannst Du allerdings einfach statisch cachen und darĂŒber immer wieder einen EM erzeugen.

Hilft Dir das weiter?

Thema verschoben

andere Themen in Area Java-Grundlagen geben (auch) nicht unbedingt gute Beispiele,
aber aufgerÀumt ist es nur wenn jeder einmal anfÀngt :wink: :
bitte genau ĂŒberleben ob ein Thema nach Java-Grundlagen gehört oder nicht,

das ist keine Selbst-Klassifizierung der ProgrammierfĂ€higkeiten sondern Themen-bezogen, ‚Schleifen und if-Abfragen‘ gehört da rein,
komplizierte EntityManager weniger (wobei man unter den Beschreibungspunkt ‚Java-Klassenbibliothek‘ natĂŒrlich auch alles verstehen kann)

notfalls passt alles noch in ‚Allgemeine Themen‘, auf ‚APIs & Frameworks‘ muss man nicht zwingend kommen, gar nicht leichte Einteilung

[QUOTE=Sym]Du möchtest einen Entitymanager pro Klasse oder einen einen EntityManager fĂŒr die Klasse Datenbankzugriff?
[/QUOTE]

Ich möchte einen EntityManager fĂŒr die Klasse Datenbankzugriff.

Ohgottohgott, ich fĂŒhl mich da noch viel zu frisch um das jetzt zu verstehen :confused:
Wie mach ich das denn die Factory statisch zu cachen und dann immer wieder einen EntityManager zu erzeugen? ._.
droidverstehtgradnurbahnhof

Sym hat’s schon geschrieben. Mach das nicht. Der EntityManager ist als kurzlebiges Wegschmeißobjekt konzipiert. Hole ihn, mach die Query, schließe ihn. FĂŒr 'ne neue Query hole Dir einen neuen.

Definiere inder Klasse Datenbankzugriff eine private static Variable vom Typ EntityManagerFactory und initialisiere sie direkt (das was Du im Moment noch in den Methoden machst).

[QUOTE=nillehammer]
Definiere inder Klasse Datenbankzugriff eine private static Variable vom Typ EntityManagerFactory und initialisiere sie direkt (das was Du im Moment noch in den Methoden machst).[/QUOTE]

Das habe ich jetzt gemacht. Aber an welcher Stelle schließe ich die EntityManagerFactory denn dann?

An derselben Stelle an der du die Anwendung schliesst :wink:

Die EMF ist ein langlebiges Objekt, waehrend der EM nur kurzlebig sein sollte.

Alles klar, danke :slight_smile: