我不明白,我的服务出了什么问题。我收到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。我不会在不同的线程中运行它,只是尝试单个请求。
答案 0 :(得分:0)
好吧,终于我找到了解决方案。最好说解决方法。
问题在于spring使用UUID
作为实体标识符的方式。
因此,有两种解决方法可以解决此问题:
Long
; uuid
字段中:@Column(columnDefinition = "BINARY(16)")
。 我从this问题中找到的最后一个解决方案。