jpq entity life cycle - insert, update...

dermoritz

Bekanntes Mitglied
anhand von anderen Threads kann man es erahnen; ich bastle gerade meine erste jpa(EclipseLink)-Anwendung. Aber "Application Managed". Mein Problem ist, zu wissen ob und wann ein Objekt "managed" ist und wann nicht. Und wann und warum es den Zusatnd des Objekt im Speicher hat und nicht den in der DB. (mein Thread http://www.java-forum.org/data-tier/102733-jpa-problem-aktualisierung-entities.html ist etwas zu speziell formuliert und kaschiert, das ich im Moment wohl noch grundsätzlichere Verständnissprobleme hab - wegen mir kann der gelöscht werden)

Am einfachsten wäre es für mich eine Möglichkeit zu kennen einen frischen Satz -Objekte aus der DB zu holen (den Status der Objekte im Speicher soll überschrieben werden).
Im Moment hab ich eine statische finde-Methode, die mir eine Liste von Objekten zurückgibt. Diese sind aber weder "managed" noch repräsentieren sie den aktuellen Stand in der DB. Die Methode sieht so aus:
Java:
    public static Tabelle1[] findeEintraege(String OrdnungsnummerTeil){
        EntityManager em = LokaleEntityManagerFactory.gibEMF().createEntityManager();
        Query q = em.createQuery("SELECT urEintrag FROM Tabelle1 urEintrag WHERE urEintrag.ordnungsnummer LIKE '%"+OrdnungsnummerTeil+"'");
        return (Tabelle1[])q.getResultList().toArray(new Tabelle1[0]);
    }
Ein Indiz dafür das diese Methode alte (den Java Speicherstatus) Objekte zurückgibt, hab ich in meinem anderen Thread geschrieben: Ich hatte das anlegen von neuen Objeten in der DB falsch implementiert -eine Verknüpfung von Objekten vergessen und genau diese Verknüpfung hat auch in der Resultliste gefehlt.

Nun hab ich ein TimeStamp-Feld welches die DB bei insert automatisch setzt. Davon bekommt Java natürlich nix mit.
Wie implementiere ich eine "finde" Funktion die "aktuelle" Objekte zurückgibt? Wie gesagt ein refresh auf den Objekten des Arrays geht nicht da sie nicht "managed" sind und ein "merge" hilft auch nix. Eine möglichkeit wäre, ein explizites refresh für jedes Objekt der Resultliste zu machen - ist das wirklich nötig? -bzw. ist es unmöglich aktuelle Objekte aus der DB zu bekommen?
 
M

maki

Gast
JPA unterstützt doch Optimistic Locking mit der @Version Anno?
Ansonsten solltest du mal überdenken was du mit "aktuelle" Objekte meinst, wenn deine find Methode keine "aktuellen" Objekte zurückliefert, ist da der Wurm drinnen, oder hab ich dich falsch verstanden?
Ein DAO bzw. Repository solltest du auch jedenfall haben.
 

dermoritz

Bekanntes Mitglied
Mein verständnis von JPA ist, dass es zu ein Objekt mit einer ID nur einmal im Speicher geben kann. Also falls ich ein find mache werden eventuell im Speicher vorhandene Objekte nicht einfach überschrieben sondern JPA geht davon aus, dass der Speicherstatus aktuell ist.
Falls man alles richtig implementiert ist das auch so (in dem anderen Thread hab ich ja da einen Fehler gemacht). Aber selbst mit korrekter Implementierung gibt es Ausnahmen: Defaultwerte in der DB. Wie z.B. "Current_TimeStamp" in einem TimeStamp Feld. Java kann nicht wissen was die DB da reingeschrieben hat. Nun ist eben die Frage wie man damit am besten umgeht. Ich habe z.B. inzwischen eine Schleife über die Resultliste gemacht die bei jedem Objekt ein refresh macht - find ich nicht so prickelnd.
Die einzige andere Möglichkeit sehe ich noch in einem em.clean() am Anfang der find-Methode - Alle Entitäten verwerfen- bzw. zu Standardobjekten machen. Das finde ich eigentlich noch viel übler, oder? Gibt es eventuell irgendeine Art "find" was automatisch ein refresh macht - falls nötig?
 

dermoritz

Bekanntes Mitglied
Bei meinem Problem hilft em.close() nicht. Ich hab sogar em.close();emf.close(); probiert - also die DB-Verbindung wurde neu aufgebaut. Dann hab ich das Objekt geholt aber es hatte immernoch den Status den es im Speicher hatte.
Und wie oben beschrieben sehe ich das gar nicht mehr als Problem. Es geht ja hier um Dinge die die Datenbank selbst manipuliert ohne es Java mitzuteilen (z.B. TimeStAMP setzen). Und nun kann man entweder alle Objekte im Speicher nullen oder eben bei einer Selectabfrage jedes ergebnis refreshen. Letzteres hab ich gemacht.
Meine persönliche Konsequenz ist, in Zukunfst mit solchen DB-Features (z.B. spezielle Default-Werte) sparsam umzugehen und sie lieber in Java umzusetzen.

Aber wenn ich das alles misserstanden habe und wenn man ohne refresh an aktuelle Objekte kommt (überschreiben der im Speicher befindlichen) dann fände ich das natürlich viel besser.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
OnDemand Vorgehen DB /Entity Data Tier 2
A Entity Manager Data Tier 4
erdmann Entity-Services ein Antipattern? Data Tier 3
S JPA Cascade: Entity nur speichern, wenn sie nicht schon existiert Data Tier 0
E JPA Session.delete einer Entity wird nicht ausgeführt Data Tier 2
G JPA: Entity Klasse @JoinColumns Problem Data Tier 2
G EJB NoSuchEJBException Zugriff auf Entity Data Tier 6
S [JPA-Neuling] - JPA 2 und dynamische Entity-Typen/DB-Schemata Data Tier 11
Landei JPA - Entity mit Maps Data Tier 2
H [Hibernate] Unknown Entity Data Tier 3
G JPA/ Eclipselink: (Alte) Kopie einer Entity? Data Tier 6
J Servlet mit eigenem Entity-Manager innerhalb von Seam-Projekt Data Tier 3
lumo Hibernate - entity class not found Data Tier 5
J synchronisierte Zugriffe auf die gleiche Entity (JPA) Data Tier 19
LCS Entity mit variablen Tabellennamen Data Tier 3
A @org.hibernate.annotations.Entity(dynamicUpdate=true, optimisticLock=OptimisticLockType.ALL) Data Tier 2
T [JPA] Update Entity in Entity Data Tier 2
byte Hibernate: Criteria & SubQuery - Unknown Entity null Data Tier 1
Final_Striker EJB3: Entity nach persist wiederfinden Data Tier 8
N Entity-Object muss auf Client aktualisiert werden Data Tier 13
0 org.hibernate.MappingException: Unknown entity Data Tier 8
K Hibernate: Unknown entity Data Tier 7

Ähnliche Java Themen

Neue Themen


Oben