4 Stimmen

Java JPA / Hibernate: Wie vermeidet man mehrere Instanzen einer Entität in einer Sitzung?

Ich komme zu der Erkenntnis, dass JPA nicht wie erwartet funktioniert, da ich oft mit mehreren Instanzen einer einzelnen Entität in einer Sitzung enden.

Hier ist der Fall: Ein Elternteil hat eine Sammlung von Kindern, die mit @OneToMany zugeordnet sind

In einer einzigen Methode:

  • Holen Sie eine Instanz des Elternteils P
  • Laden Sie die Sammlung der Kinder mit P.getChilds(): Sie enthält eine Instanz von C1 und C2
  • dann suchen Sie ein spezifisches Kind mit einer optimierten JPA-Abfrage, wobei der Elternteil P als Parameter fungiert: Kind C = dao.getSpecificChild(P)

Hier würde ich erwarten, dass C eine der beiden bereits geladenen Instanzen (C1 oder C2) ist. Ich dachte, JPA würde die bereits vorhandene Instanz in seiner aktuellen Sitzung überprüfen. Aber JPA lädt eine neue Instanz von C (ob es sich um C1 oder C2 handelt, spielt hier keine Rolle).

Dann habe ich zwei verschiedene Instanzen von C.

Meine Frage lautet: Ist dies das erwartete Verhalten? Wenn ja, wie kann ich meine Entitätsinstanzen in einer Sitzung vereinen?

Prost

2voto

Sean Patrick Floyd Punkte 283617

wie kann ich meine Entitätsinstanzen in einer Sitzung abgleichen?

Wenn Sie den Zustand von Entität a auf Entität b übertragen möchten, können Sie Folgendes tun:

entityManager.merge(a);
entityManager.refresh(b);

0voto

DataNucleus Punkte 15309

Ich würde auch erwarten, dass die Instanz von C, die aus der Abfrage zurückgegeben wird, eine der zuvor zurückgegebenen Cs ist (sofern es sich um dieselbe Transaktion handelt), da sie bereits in der Transaktion eingetragen sind, und das ist genau das, was DataNucleus sicherlich tut (da es auch JDO implementiert und das Teil des Standards ist), und dafür ist ein L1-Cache da.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X