Wie zu beheben StaleObjectStateException mit JPA und Hibernate

Controller-Logik:

def updateObject() {

    Object o = Object.get(params.id as Long)

    o.otherObjects.clear()

    objectDataService.saveObject(o.id)

    OtherObject newObject = new OtherObject;

    o.addToOtherObjects(newObject)

    objectDataService.saveObject(o.id)

}

ServiceLogic

def saveObject(long profileId) {
    o.save(flush:true)
}

was passiert

in 90% der Fälle wird dies nur funktionieren.

Probleme

ERROR errors.GrailsExceptionResolver  - StaleObjectStateException occurred when processing request: [GET] /controller/updateObject - parameters:
stuff[]: data
Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect) : [com.path.Object#1]. 
Stacktrace follows:
Message: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect) : [com.path.Object#1]

habe ich gelesen, durch Fragen und fand die merge aufrufen, sehen Sie oben. es löste über 50% der Fälle, aber nicht alle.

  • wäre es nicht besser hier, wenn Sie verschoben diese Logik in einem service-Methode so alles unter der gleichen Transaktion?
  • ich will nicht, um eine überlastung des service. glaubst du, es würde Sinn machen?
  • Es ist immer besser, sich zu bewegen, die business-Logik zu Diensten und machen Sie Ihren Controller so Dünn wie möglich (mit Dünn meine ich mit weniger code-Zeilen). Dies wird Ihnen helfen, die Wiederverwendung von code, wo immer erforderlich, und Sie sparen eine Menge Zeit in Tests als gut.
  • Erwarten Sie, dass gleichzeitige Zugriffe auf diese Aktion, die von vielen Benutzern oder nur ein Benutzer auf die Aktion mehr als einmal?
  • es ist derzeit nur selber testen. keine gleichzeitige Benutzer (alle auf localhost)
Schreibe einen Kommentar