4 Stimmen

EntityManager aktualisiert die Daten nach der Abfrage nicht

Mein aktuelles Projekt verwendet HSQLDB2.0 und JPA2.0.

Das Szenario ist: Ich frage die DB ab, um eine Liste von contactDetails von person . Ich lösche einzelne contactInfo auf der Benutzeroberfläche, aber speichern Sie diese Daten nicht ( Cancel der Sparteil).

Ich wieder tun die gleiche Abfrage, jetzt die Ergebnisliste ist 1 weniger als vorherige Ergebnis coz ich eine contactInfo auf UI gelöscht haben. Aber das contactInfo ist immer noch bei der DB erhältlich, wenn ich nachschaue.

Aber wenn ich die entityManager.clear() vor Beginn der Abfrage, erhalte ich jedes Mal korrekte Ergebnisse.

Ich verstehe dieses Verhalten nicht. Kann mir das jemand erklären?

15voto

Behrang Punkte 44032

Versuchen Sie Folgendes, anstatt erneut eine Anfrage zu stellen:

entityManager.refresh(person);

Ein ausführlicheres Beispiel:

EntityManagerFactory factory = Persistence.createEntityManagerFactory("...");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();

Person p = (Person) em.find(Person.class, 1);
assertEquals(10, p.getContactDetails().size()); // let's pretend p has 10 contact details
p.getContactDetails().remove(0);
assertEquals(9, p.getContactDetails().size());

Person p2 = (Person) em.find(Person.class, 1);
assertTrue(p == p2); // We're in the same persistence context so p == p2
assertEquals(9, p.getContactDetails().size());

// In order to reload the actual patients from the database, refresh the entity
em.refresh(p);
assertTrue(p == p2);
assertEquals(10, p.getContactDetails().size());
assertEquals(10, p2.getContactDetails().size());

em.getTransaction().commit();
em.close();
factory.close();

2voto

axtavt Punkte 233070

Das Verhalten von clear() wird erklärt in seinem javadoc:

Löscht den Persistenzkontext, wodurch alle verwalteten Entitäten abgetrennt werden. Änderungen an Entitäten, die noch nicht in die Datenbank übertragen wurden, werden nicht beibehalten.

Das heißt, die Entfernung von contactInfo wird nicht beibehalten.

ContactInfo wird nicht aus der Datenbank entfernt, weil Sie die Beziehung zwischen ContactDetails y ContactInfo , aber nicht ContactInfo selbst. Wenn Sie sie entfernen wollen, müssen Sie dies entweder explizit mit remove() oder angeben orphanRemoval = true über die Beziehung.

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