Neulich ergab sich die Frage, wie man sicherstellen kann, dass die Objekte aus einer JPA Anfrage nicht attached sind, um dies nicht versehentlich zu verändern. Hierbei gibt es den „direkten Weg“.
Direkter Weg
Wir durchlaufen die Ergebnisliste und rufen für die Objekte die detach Funktion des Entitymanagers auf.
Offensichtlich ist dieser Weg nicht sehr elegant.
Transaktion
Das gleiche Resultat kann erreicht werden, wenn die Abfrage in einer eigenen Transaktion des Entitymanagers gestartet werden. Es wird die Annotation
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
an der entsprechenden Methode gesetzt. Aber Achtung: bei Aufrufen innerhalb einer EJB wird dieses Attribut nicht ausgewertet. Es muss also der Aufruf „von außen“ also einer anderen EJB oder Managed Bean erfolgen.