在Hibernate中使用注释自动生成字符串主键

5

我对Spring Boot还比较陌生,但在模型中有一个Id(主键)是字符串类型的,我需要在保存新实体时自动生成它。

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private String id;
private String name;
private String description;

但是,当我保存新实体时,出现了这个错误。
"message": "Unknown integral data type for ids : java.lang.String; nested exception is org.hibernate.id.IdentifierGenerationException: 

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


这是非常针对Hibernate的问题。为什么选择字符串数据类型的ID而不是整数/长整数值? - Himanshu Bhardwaj
谢谢!我将此应用程序用作API。因此,请求参数(如Id)以字符串形式出现。这就是原因。 - Tharindu Thisarasinghe
这意味着id已经在请求中提供,您不需要生成它。然后删除@GeneratedValue注释。Hibernate将把它视为分配的标识符,并且不会尝试自我丰富。 - Himanshu Bhardwaj
好的,对于更新操作,id是已经提供的。但是对于保存操作,我需要自动生成id。 - Tharindu Thisarasinghe
在这种情况下,请按照下面提到的答案。 - Himanshu Bhardwaj
2个回答

6

当你使用auto生成值与String字段一起使用时,它不能为你工作。

要使其工作,您需要更改@GeneratedValue注解以使用generator而不是strategy,并添加@GenericGenerator注解来命名生成器并指向策略。

例如,如果你想生成自动生成的UUID作为你表的主键,你的代码看起来像:

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

除了以上内容,您还可以实现 IdentifierGenerator 来创建自己的生成器。您可以在此处查看更多信息:

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


6

@GeneratedValue(strategy = GenerationType.AUTO)这将根据底层数据库生成任何标识列、序列或表中的任何一个。

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

如果您想将Id生成为字符串,则可以使用generator="uuid",如下所示

@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid2")
private String id;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接