【问题标题】:Spring boot UUID primary key entity doesn't show right id after createdSpring boot UUID主键实体在创建后不显示正确的ID
【发布时间】:2021-11-01 00:44:05
【问题描述】:

所以我有以 UUID 作为主键的实体。在我的服务中创建实体后,响应返回错误的 ID。

我的角色实体

package denny.study.stock.entity

import denny.study.stock.util.converter.JsonToMapConverter
import org.hibernate.annotations.CreationTimestamp
import org.hibernate.annotations.GenericGenerator
import org.hibernate.annotations.Type
import org.hibernate.annotations.UpdateTimestamp
import java.util.*
import javax.persistence.*

@Entity
@Table(name = "roles")
class Role {

    @Id
    @GeneratedValue(generator = "uuid2")
    @GenericGenerator(name = "uuid2", strategy = "uuid2")
    @Column(name = "id", columnDefinition = "CHAR(36)")
    @Type(type = "uuid-char")
    var id: UUID = UUID.randomUUID()

    @Column
    var name: String = ""

    @Column
    var slug: String = ""

    @Column
    @Convert(converter = JsonToMapConverter::class)
    var permissions: MutableMap<String, Boolean>? = null

    @Column(name = "created_at")
    @CreationTimestamp
    var createdAt: Date = Date()

    @Column(name = "updated_at")
    @UpdateTimestamp
    var updatedAt: Date? = null

}

我在角色服务中的存储方法

    override fun store(roleRequest: RoleRequest): RoleResponse {
        val role = Role().apply {
            name = roleRequest.name
            slug = roleRequest.slug
            permissions = roleRequest.permissions
        }

        roleRepository.save(role)

        return RoleResponse(role)
    }

我的角色回复

package denny.study.stock.model.response.role

import denny.study.stock.entity.Role

class RoleResponse(role: Role) {

    var id = role.id

    var name = role.name

    var slug = role.slug

    var permissions = role.permissions

}

json 响应返回 id “f95bddf6-eb22-49bb-b8e6-5eb819603fa9”

{
    "code": 200,
    "status": "OK",
    "data": {
        "id": "f95bddf6-eb22-49bb-b8e6-5eb819603fa9",
        "name": "Role 1",
        "slug": "role-1",
        "permissions": {
            "asd": true,
            "dsa": false
        }
    }
}

在 DB 中,它存储为“87596692-7ee9-4ecb-a425-3b1372d901f4”。你知道为什么它返回错误的 id 吗?谢谢!

【问题讨论】:

  • 能否请您检查执行的SQL语句。 logging.level.org.hibernate.type.descriptor.sql.basicbinder=trace 和 logging.level.org.hibernate.sql=debug

标签: spring-boot kotlin spring-data-jpa


【解决方案1】:

您正在使用@GeneratedValue 注释,并将UUID.randomUUID() 分配给id 属性。要么使用一个,要么使用另一个,而不是同时使用。

如果您希望 ID 由持久性提供程序生成,则保留 @GeneratedValue 并删除 @GenericGenerator(这是一个 Hibernate 注释)和 UUID.randomUUID()。如果您想自己执行此操作,请删除 @GeneratedValue@GenericGenerator

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-18
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 2019-03-19
    • 2014-09-10
    相关资源
    最近更新 更多