Frage

Ich habe einige Einheiten eine Feder ROO Anwendung, Satz Persistenz OpenJPA und erstellt einzurichten. Dann ersetzte ich Spring MVC mit Apache Wicket. Stuff scheint zu funktionieren gut, und ich habe erfolgreich eine Liste von Kundeneinheiten angezeigt.

Als nächstes stand die Bearbeitung Ansicht für die Kunden. Denn jetzt habe ich eine Wicket Form gemacht, die die OpenJPA Einheit direkt als Form-Modell verwendet, und so musste ich die Entity-Klasse machen Serializable implementieren.

Nun, ich bin mir nicht sicher, wie man richtig die OpenJPA Persistenz zu implementieren, was ich jetzt habe, ist dies:

@Override
protected void onSubmit() {
    try {
        if (customer.getId()!=null) {
            customer.merge();
        }
        else {
            customer.persist();
        }
    }
    catch (Exception e) {
        throw new Error(e);
    }
    super.onSubmit();
}

Das funktioniert, aber nur einmal pro Kunde Objekt. Irgendwie. Das heißt, ich meine Form einmal und es funktioniert sowohl mit einem neuen Kunden (.persist ()) und ein bestehender Kunde (.merge ()). Allerdings habe ich das Formular erneut für den gleichen Kunden stelle ich diesen Fehler (ich habe noch einige Zeilenumbrüche hier):

<openjpa-2.0.0-r422266:935683 nonfatal store error>
org.apache.openjpa.persistence.OptimisticLockException:
An optimistic lock violation was detected when flushing object instance "no.magge.iumb.domain.crm.PrivateCustomer-379" to the data store.
This indicates that the object was concurrently modified in another transaction.

Meine Frage ist, was ist der richtige Weg, mit OpenJPA bestehen bleiben und warum bin ich diesen Fehler zu bekommen?

Wicket-weise: Soll ich einen separaten Wicket IModel mit einem abnehmbaren Kundenmodell erstellt und könnte das der Grund sein, dass ich diese Probleme

?

Dank einem Haufen für jeden Hinweis!

War es hilfreich?

Lösung

Tun Sie sich selbst einen Gefallen und trennen Sie Ihre Anwendungsschichten. Code in einer Ansicht nicht immer auf eine Datenbank zugreifen sollte.

Erstellen Sie eine Service-Schicht und / oder eine Dao Schicht, Unit-Test der Code dieser Schichten zu sehen, dass sie arbeiten und dann inject einem dao oder Dienstobjekt in die Wicket-Komponente. (Ich würde Ihnen empfehlen Feder zu verwenden für das, aber man kann es auch manuell tun)

Mit Ihrem Szenario gibt es so viele verschiedene Dinge, die an einer Stelle scheitern kann, und es ist fast unmöglich, sie zu trennen.

Hier sind einige Hinweise:

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top