Grails 2.5.1 domain.get (id) получает кэшированные данные - PullRequest
0 голосов
/ 06 сентября 2018

Я новичок в заводной и граальской. Grails версия 2.5.1 Groovy версия 2.4.5 Моя проблема: У меня есть метод обновления в customerController.

CustomerController:

def update(){
   def map = [:]
   def customerId = params.id
   def newCustomer = request.JSON
   def customer = customerService.updateCustomer(customerId, newCustomer)

   customer.validate()

   if (customer== null) {
       map['success'] = false
       map['message'] = "Record not found"

       return map
   }

   if (customer.save()) {
       map['success'] = true
       map['data'] = customer
   } else {
       validateErrorService.extractErrors(customer, map)
   }

   return map
}

В методе обновления я вызываю customerService.updateCustomer

CustomerService:

def updateCustomer(customerId, newCustomer){
    def customer = Customer.get(customerId)

    if (customer == null) {
        return null
    }
    verifyLead(newCustomer.leadId)

    customer.firstName = newCustomer.firstName
    customer.lastName = newCustomer.lastName
    if(!customer.hasErrors())
        customer.save(flush:true)

    return customer
}

Затем я вызываю метод verifyLead для обновления ведущего домена

def verifyLead(jsonLead, userId){
    Long leadId = jsonLead.id as Long
    Lead lead = Lead.get(leadId)

    lead.status = "Proceed"
    lead.save(flush: true)
}

В ведущем домене Lead.get (leadId) возвращает старые (кэшированные) данные Итак, когда я сохраняю: lead.save (flush: true) это ошибка hibernate.object.staleException

1 Ответ

0 голосов
/ 06 сентября 2018

(я размышляю здесь, потому что я не знаю ваши настройки)

Краткий ответ: Часто исключение StaleObjectStateException (которое, я полагаю, вы получаете) возникает, когда запись базы данных за объектом домена (в вашем случае Lead) была обновлена ​​между последним чтением из БД и вашим вызовом save(). В зависимости от ваших настроек это может быть второй экземпляр вашего приложения Grails.

Одним из возможных решений может быть пессимистическая блокировка (см. 7.3.5 Пессимистическая и оптимистическая блокировка в документации Grails).

Более длинный ответ (извините, если вы уже знаете более техническую информацию): get() возвращает объект домена из нижележащего сеанса Hibernate. Этот сеанс не распознает изменения в базе данных автоматически. Поэтому, если БД изменится, данные в вашем сеансе Hibernate могут устареть. GORM (слой БД Grails) обычно использует оптимистическую блокировку (пытается сохранить и увеличивает значение в поле version записи БД).

Если версия объекта домена, который пытается сохранить ваш код, меньше, чем версия объекта в БД, то GORM / Hibernate считает, что лучше создать исключение, чем обновить запись и, возможно, уничтожить более новые изменения.

При пессимистической блокировке ваш код сначала блокирует запись или таблицу БД, затем обновляет запись и, наконец, снимает блокировку.

Но будьте осторожны: пессимистическая блокировка приносит с собой свои проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...