Spring Row已由另一个事务更新或删除(或未保存的值映射不正确)

时间:2019-01-06 10:14:32

标签: spring hibernate spring-boot kotlin

我不明白,我的服务出了什么问题。我收到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 :(得分:0)

好吧,终于我找到了解决方案。最好说解决方法。

问题在于spring使用UUID作为实体标识符的方式。 因此,有两种解决方法可以解决此问题:

  • 首先,您可以将ID字段类型更改为其他类型,例如Long
  • 或者您可以将此注释添加到uuid字段中:@Column(columnDefinition = "BINARY(16)")

我从this问题中找到的最后一个解决方案。