Hallo zusammen.
Folgendes funktioniert nicht, wie von mir erwartet:
Die Methode, um einen Datensatz "Scope" zu editieren, habe ich mir von NetBeans automatisch generieren lassen. Im laufenden Betrieb meiner WebApp klappt auch alles einwandfrei. Wenn ich jedoch manuell in der Datenbank einen Datensatz lösche, dann funktioniert das Speichern innerhalb der WebApp jedoch komischerweise trotzdem noch! Folgender Code wirft keine Exception, obwohl es den Datensatz "scope" in der Datenbank definitiv nicht gibt.
Die find()-Operation in Zeile 6 findet den Datensatz, obwohl er nicht in der Datenbank existiert.
Vor und nach der merge()-Operation ist der "richtige" Datensatz in der Variablen scope gespeichert. In der Datenbank wird aber nichts aktualisiert (den Datensatz gibt es ja nicht) und es wird auch kein neuer Datensatz angelegt.
Wieso findet der Entitymanager aber überhaupt etwas? Und wieso wird keine Exception geworfen, wenn sich in der Datenbank nichts tut?
Aufgerufen wird die Methode innerhalb meiner BackingBean wie folgt:
Gruß Fant
Folgendes funktioniert nicht, wie von mir erwartet:
Die Methode, um einen Datensatz "Scope" zu editieren, habe ich mir von NetBeans automatisch generieren lassen. Im laufenden Betrieb meiner WebApp klappt auch alles einwandfrei. Wenn ich jedoch manuell in der Datenbank einen Datensatz lösche, dann funktioniert das Speichern innerhalb der WebApp jedoch komischerweise trotzdem noch! Folgender Code wirft keine Exception, obwohl es den Datensatz "scope" in der Datenbank definitiv nicht gibt.
Java:
public void edit(Scope scope) throws IllegalOrphanException, NonexistentEntityException, RollbackFailureException, Exception {
EntityManager em = null;
try {
utx.begin();
em = getEntityManager();
Scope persistentScope = em.find(Scope.class, scope.getRefRmRequestId());
RmRequest rmRequestOld = persistentScope.getRmRequest();
RmRequest rmRequestNew = scope.getRmRequest();
List<String> illegalOrphanMessages = null;
if (rmRequestNew != null && !rmRequestNew.equals(rmRequestOld)) {
Scope oldScopeOfRmRequest = rmRequestNew.getScope();
if (oldScopeOfRmRequest != null) {
if (illegalOrphanMessages == null) {
illegalOrphanMessages = new ArrayList<String>();
}
illegalOrphanMessages.add("The RmRequest " + rmRequestNew + " already has an item of type Scope whose rmRequest column cannot be null. Please make another selection for the rmRequest field.");
}
}
if (illegalOrphanMessages != null) {
throw new IllegalOrphanException(illegalOrphanMessages);
}
if (rmRequestNew != null) {
rmRequestNew = em.getReference(rmRequestNew.getClass(), rmRequestNew.getRmRequestId());
scope.setRmRequest(rmRequestNew);
}
scope = em.merge(scope);
if (rmRequestOld != null && !rmRequestOld.equals(rmRequestNew)) {
rmRequestOld.setScope(null);
rmRequestOld = em.merge(rmRequestOld);
}
if (rmRequestNew != null && !rmRequestNew.equals(rmRequestOld)) {
rmRequestNew.setScope(scope);
rmRequestNew = em.merge(rmRequestNew);
}
utx.commit();
} catch (Exception ex) {
try {
utx.rollback();
} catch (Exception re) {
throw new RollbackFailureException("An error occurred attempting to roll back the transaction.", re);
}
String msg = ex.getLocalizedMessage();
if (msg == null || msg.length() == 0) {
Long id = scope.getRefRmRequestId();
if (findScope(id) == null) {
throw new NonexistentEntityException("The scope with id " + id + " no longer exists.");
}
}
throw ex;
} finally {
if (em != null) {
em.close();
}
}
Die find()-Operation in Zeile 6 findet den Datensatz, obwohl er nicht in der Datenbank existiert.
Vor und nach der merge()-Operation ist der "richtige" Datensatz in der Variablen scope gespeichert. In der Datenbank wird aber nichts aktualisiert (den Datensatz gibt es ja nicht) und es wird auch kein neuer Datensatz angelegt.
Wieso findet der Entitymanager aber überhaupt etwas? Und wieso wird keine Exception geworfen, wenn sich in der Datenbank nichts tut?
Aufgerufen wird die Methode innerhalb meiner BackingBean wie folgt:
Java:
public void editScope() {
System.out.println("editScope() aufgerufen!");
try {
scopeJpaController.edit(rmRequest.getScope());
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("#Speichern erfolgreich"));
} catch (Exception e) {
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("#Fehler beim Speichern!"));
}
}
Gruß Fant