在 Hibernate 中自动生成带注释的字符串主键

Tha*_*cky 4 java hibernate auto-generate

我对 Spring Boot 很陌生,模型中有一个 Id(主键),它是 String,我需要在保存新实体时自动生成它。

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private String id;
private String name;
private String description;
Run Code Online (Sandbox Code Playgroud)

但是,保存新实体时出现此错误。

"message": "Unknown integral data type for ids : java.lang.String; nested exception is org.hibernate.id.IdentifierGenerationException: 
Run Code Online (Sandbox Code Playgroud)

如何避免此错误并在id保存新实体时自动生成。

Ari*_*tex 6

auto当您尝试将生成的值与字段一起使用时,这对您不起作用String

为了使其工作,您需要更改@GeneratedValue注释以使用 agenerator而不是 a strategy,并添加一个@GenericGenerator注释来命名生成器并指向策略。

例如,假设您想要生成自动生成的 UUID 作为表的 PK,您的代码将如下所示:

@Id
    @GeneratedValue(generator = "UUID")
    @GenericGenerator(
        name = "UUID",
    strategy = "org.hibernate.id.UUIDGenerator"
    )
@Column(updatable = false, nullable = false)
private String id;
Run Code Online (Sandbox Code Playgroud)

除了上述内容之外,您始终可以实现IdentifierGenerator创建自己的生成器。您可以在这里查看更多信息:

如何使用 Hibernate 实现自定义字符串序列标识符生成器


Pan*_*boo 6

@GeneratedValue(strategy = GenerationType.AUTO) 这将导致任何标识列、序列或表取决于基础数据库。

如果你看这里,你会注意到所有这些都生成了 long、short 或 int 类型的 id,而不是 String 类型的。

如果你想生成 Id 作为字符串,那么使用 generator="uuid" 如下

@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid2")
private String id;
Run Code Online (Sandbox Code Playgroud)