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: