Tut EntityManager ist die find () - Methode erstellen Sie eine neue Instanz von JPA-Klasse?
Ich bin ein wenig verwirrt. Die Frage ist im Titel, und hier ist der Grund, warum ich Frage.
Ich habe JSF + JPA web-Anwendung, die Sie auf eine einzelne VM.
Und eine JPA-Klasse @Transient
Feld. Stellen Sie sich nun vor, einige web-Benutzer öffnet eine Seite und führt den code unten
import javax.persistence.EntityManager;
//method 1 in backing bean
Agent a = entityManager.find(Agent.class, "007");
a.setTransientValue("Aston Martin");
Welche Ausgabe sollte ich erwarten, wenn ein anderer web-user/thread versucht zu Lesen, transient Wert:
//method 2 in backing bean
Agent a = entityManager.find(Agent.class, "007");
String val = a.getTransientValue();
In anderen Worten und in Bezug auf die JVM, hat find()
Methode zurück, die immer neue Instanz der Klasse oder dem gleichen oder "kommt darauf an"? Ich habe mir durch JSR-220 für eine Antwort, aber ohne Erfolg, keine Hilfe-oder doc-Referenz würde geschätzt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Rufen Sie
find(..)
innerhalb derselben Sitzung (das heißt, innerhalb der gleichen entitymanager Lebensdauer), dann die gleiche Objekt-Referenz wird zurückgegeben. Die Dokumentation vonfind()
gibt:In anderen Worten, die
EntityManager
hält eine Sammlung map (wahrscheinlich) von Entitäten. Wenn Sie anrufenfind
es wird überprüft, dass die Sammlung. Wenn die Person dort nicht gefunden, wird eine Abfrage an die Datenbank gemacht wird. Der zurückgegebene Entität in der Karte, so dass nachfolgende Aufrufe wird es dort finden.Aber beachten Sie wieder, dass dies nur für den Zeitraum einer Sitzung. Dies ist in der Regel das gleiche wie eine http-Anfrage (in der web-app-Kontext)
Tatsächlich zu verstehen, wie das funktioniert, ist es wichtig zu verstehen, die Beziehung zwischen den entity-manager und den Kontext an.
Den entity-manager ist die öffentliche Schnittstelle, über die Sie Zugriff auf Ihre Personen jedoch, Ihre Einheiten befinden sich in einem Rahmen befestigt, um Ihre entity-manager. Das Verständnis der Lebenszyklus der verschiedenen Arten von Kontexten wird Ihre Frage beantworten.
Persistenz-Kontexte können unterschiedliche Typen sein. In Java-EE-Anwendungen, können Sie entweder ein transaction-scoped persistence context oder eine erweiterten Persistenz-Kontext. In der JSE-Anwendung, die Natur der Zusammenhang ist gesteuert durch die Entwickler.
Wenn Sie Fragen, für eine Entität auf die Entität, manager, sieht es für die Einheit auf dem Rahmen befestigt, wenn es feststellt, dass die Einheit da ist, dann gibt es zurück, ansonsten ruft Sie die Entität aus der Datenbank. Nachfolgende Aufrufe für diese Entität im Kontext wird wieder die gleiche Entität.
Transaction-scoped
In eine Java EE-Anwendung mithilfe der transaction-scoped persistence context, beim ersten Zugriff auf entity-manager überprüft, ob der aktuelle JTA Transaktion hat einen Rahmen befestigt, wenn kein Kontext ist noch vorhanden, wird ein neuer Kontext erstellt wird, und der entity manager ist mit diesem Zusammenhang. Dann wird die Entität aus der Datenbank gelesen (o aus dem cache, wenn vorhanden) und es wird in den Kontext. Wenn Sie Ihre Transaktion beendet (commit oder rollback), der Kontext ungültig wird und was auch immer die Entitäten in der it ablösen. Dies ist das klassische Szenario für stateless sessions Bohnen.
Bedeutet dies auch, dass je nachdem, wie Sie das design Ihrer Transaktionen, Sie können am Ende mit mehr als einem Kontext.
Erweiterten Persistenz-Kontext
In eine Java EE-Anwendung mit zustandsbehaftete session beans könnten Sie z.B. den Kontext, um zu überleben mehrerer bean-Aufrufe, da Sie nicht, wie Sie zu Begehen, bis die Bohnen wurden zum entfernen markiert, richtig? In diesen Fällen müssen Sie verwenden Sie ein extended persistence context. In diesem Fall wird der persistence context wird erstellt, wenn es ist zuerst notwendig, aber es wird nicht werden ungültig, bis Ihr mark die zustandsbehaftete bean zum entfernen.
Dies bedeutet, dass, unabhängig von der Instanz der entity-manager, wird eingespritzt, diese Bohne, die in nachfolgenden aufrufen der zustandsbehaftete session beans-Methoden, können Sie sicher sein, immer Zugriff auf den gleichen Kontext, und daher auch nachfolgende Aufrufe wird wieder die gleiche Instanz, denn es ist der gleiche Kontext.
Auch, Ihre änderungen werden nicht geleert werden, bis die Bohne ist zum entfernen markiert oder Sie manuell Spülen Sie Sie.
Application-Managed
Können Sie immer manuell instanziieren entity manager factory und entity manager. Dies ist, was Sie normalerweise tun, in einer JSE-Anwendung, richtig?
Für diese Art von Anwendungen, die Sie nicht in der Regel ein container, den Umgang mit der JTA-Transaktionen, Recht? So verwenden Sie die Ressource lokalen Transaktionen und Sie sind verantwortlich für die manuelle commit oder Rollback änderungen.
Für diese Art von Anwendung, wenn Sie instanziieren der entity-manager, ein Kontext wird automatisch angefügt.
Abhängig von Ihrer Anwendung können Sie sich entscheiden, erstellen Sie eine Globale entity manager, deren Lebens-Zyklus angehängt wird, um die Lebensdauer der Anwendung selbst. Das heißt, dass ein single-entity-manager für die gesamte Lebensdauer der Anwendung. In diesen Fällen der Kontext wird erstellt und zerstört werden mit dem entity manager.
Oder könnten Sie ein entity-manager pro Gespräch (z.B. Transaktion) mit Ihrer Anwendung Benutzer. Der Umfang in diesem Fall wird von Ihnen festgelegt, aber immer noch, Ihr Kontext wird geschaffen und zerstört mit Ihren entity-manager.