Spring Row был обновлен или удален другой транзакцией (или отображение несохраненных значений было неверным) - PullRequest
0 голосов
/ 06 января 2019

Не могу понять, что не так с моим Сервисом. Я получаю org.hibernate.StaleObjectStateException, пытающийся запустить этот метод:

fun updateNameForPhone(phone: String, name: String): Client {
    val res = clientRepository.findByPhone(phone) ?: throw ClientNotFoundException(phone)

    res.name = name
    return clientRepository.save(res)
}

ClientRepository:

@Repository
interface ClientRepository : JpaRepository<Client, UUID> {

    fun findByPhone(phone: String): Client?
}

Клиентский объект:

@Entity
data class Client(
        var name: String = "",
        var phone: String = "",
        @Id @GeneratedValue(strategy = GenerationType.AUTO)
        val uuid: UUID = defaultUuid()
)

Исключение:

Объект класса [com.app.modules.client.domain.Client] с идентификатором [12647903-7773-4f07-87a8-e9f86e99aab3]: сбой оптимистической блокировки; вложенное исключение - org.hibernate.StaleObjectStateException: строка была обновлен или удален другой транзакцией было неверно) [Com.app.modules.client.domain.Client # 12647903-7773-4f07-87a8-e9f86e99aab3] "

В чем причина? Я использую Kotlin 1.3.11, Spring Boot 2.1.1, MySql. Я не запускаю его в разных потоках, просто пробую одним запросом.

1 Ответ

0 голосов
/ 10 января 2019

Ну, наконец-то я нашел решение. Лучше скажи обходной путь.

Проблема в том, что Spring использует UUID в качестве идентификатора сущности. Таким образом, есть два обходных пути, решающих эту проблему:

  • сначала вы можете изменить тип поля вашего идентификатора на другой, например, Long, если это возможно;
  • или вы можете добавить эту аннотацию в поле uuid: @Column(columnDefinition = "BINARY(16)").

Последнее решение, которое я нашел из этого вопроса.

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