# [JPA]



## ratnalein (4. Apr 2014)

Hallo zusammen,



> Calling persist on a new object will also make it become managed



ich würde gerne wissen, ob der obige Satz folgendes bedeuten KANN:
Wenn ich ein Objekt auf die Datenbank persistiere und  ich anschließend in dem gleichen Persistence Context dieses Objekt aus der Datenbank per find hole, beispielsweise so:

```
Person personVonDerDB = personDao.findPerson(...);
```
, referenziert denn personVonDerDB genau auf das Objekt, das vorher per persist auf die DB persistiert wurde?  

Kurz gefragt:  habe ich somit 2 Objekte oder lediglich ein einziges Objekte mit 2 Referenzvariablen?

Vielen Dank für Eure Hilfestellungen.

Viele Grüße aus Rheinland,

Eure Ratna


----------



## Hootch (3. Jun 2014)

Hallo Ratna,

der PersistenceContext ist die Verwaltung der Connection zur Datenbank. Von Interesse ist, ob du eine JTA / NON-JTA JPA Implmentierung nutzt (Transaktionsfähig ja/nein).

Mit JPA/JTA:

Alle neu erzeugten Objekte sind bei einer JPA/JTA flüchtig, bis diese per create in der Datenbank erstellt werden. Benötigt man im Vorfeld gespeicherte Objekte um eine nachfolgende Abfrage durchzuführen (personDBService.find() ...) kann dies per flush() oder direktem create() durchgeführt werden. Solange das Ende der Ausführung nicht erreicht wurde, wird kein commit() ausgelöst.

Einfach gesagt: Lege 1-n Objekte an wende create oder flush() an (flush synct alles!) und führe in Folge dein find(...) aus. Die Transaktion unterliegt den ACID Regeln, sofern Du nicht commit() sagst oder das Ende der Ausführung erreicht wurde.

Tip: Befasse Dich mit den CASCADE Auszeichnungen von JPA und verstehe die Abhängigkeiten im Objektgraphen.

Ohne JTA:
Im Kern: Du musst die Verwaltung der Transaktion selber übernehmen. 

Ohne Transaktion:
Lass es  Schwierig, Fehlerbehaftet. Man sollte genau wissen was & warum :rtfm::idea:


----------



## Niki (5. Jun 2014)

Du liegst richtig (am besten einfach sowas selber ausprobieren, da lernst du am meisten)

find nach persist liefert das gleiche Objekt zurück.

wenn du aber ein flush und ein detach nach dem persist aufrufst, wird das Objekt neu aus der Datenbank geladen und du bekommst ein neues zurück


----------

