Verständnisproblem warum em.flush() notwendig ist hier

LimDul

Top Contributor
Folgendes, Pseudo-Code Mini-beispiel läuft im Applicationsserver (JBoss) in einer Transaktion

Java:
public void dummy() {
MyObject myObject = new MyObject();
entitymanager.persist(myObject);
//  entitymanager.flush();
entityManager.createQuery("SELECT COUNT(*) FROM MyObject");
}

Ohne flush ist das neue Objet im dem Query-Ergebnis nicht enthalten, mit flush schon.

Ich hätte erwartet, dass der Entitymanager sicherstellt, dass ich innerhalb einer Transaktion ein konsistentes Bild der Daten hab und erkennt, dass ich beim Query auf Objekte zugreife die noch nicht geflushed sind. Scheint aber nicht so zu sein. Wo ist das dokumentiert? (Kontext: Eclipselink 2.7.9 als JPA-Implementierung)
 

LimDul

Top Contributor
Es ist sogar ein normales select.

Das Objekt wird mit ein paar Attributen angelegt und dann per Select über genau diese Attribute wieder selektiert. Und wird nicht gefunden.

Beim Logging der SQL-Statements sehe ich auch das insert Statement nicht, nur das Eclipselink sich aus der Sequenze für das Objekt eine Nummer zieht. Ich sehe dann aber das auf der DB ausgeführte SQL-Select (was, da das Insert ohne flush nie ausgeführt wurde) das Objekt nicht findet.
 

LimDul

Top Contributor
Für den Context, es handelt sich hierbei immer JPQL Queries, nie native Queries


Genauer:
SELECT m FROM MarkerEntity m WHERE m.referenceId = :referenceId
Das ist das Query (mit geänderten Bezeichnern)

Die ID ist kein Primary-Key und auch kein Foreign-Key.
 

LimDul

Top Contributor
M

Mart

Gast
SELECT m FROM MarkerEntity m WHERE m.referenceId = :referenceId
also nur ins blaue geraten .. du hast in dem select die m die Tabelle angegeben und keine Spalten, m entspricht ja dem Temporären Tabellen namen von MakerEntity
 

LimDul

Top Contributor
also nur ins blaue geraten .. du hast in dem select die m die Tabelle angegeben und keine Spalten, m entspricht ja dem Temporären Tabellen namen von MakerEntity
Das Query ist schon korrekt :) Mit flush klappt es auch. Ursache ist schlicht der flush-Mode, den ich nicht auf dem Schirm hatte + architekturelle Unsauberheiten in der Architektur der Software. Eigentlich müssten da fachlich eigene autonome Transaktionen rein, aber das ist ein Thema für später und in Ruhe.
 

Ähnliche Java Themen


Oben