如何在弹簧启动时使用Hibernate生成自动UUID

mat*_*tts 10 uuid hibernate jpa spring-boot

我想要实现的是生成一个在数据库插入期间自动分配的UUID.类似于名为"id"的主键列生成id值.

模型值看起来像这样:

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(nullable = false)
private Long id;


@GeneratedValue(generator = "uuid2")
@GenericGenerator(name = "uuid2", strategy = "uuid2")
@Column(name = "uuid", columnDefinition = "BINARY(16)")
private UUID uuid;
Run Code Online (Sandbox Code Playgroud)

但是当DB插入完成时."uuid"是空的.

非常感谢帮助.如果我问一个明显的愚蠢问题,我很抱歉.

fg7*_*8nc 17

你能试一下吗?

    @Id
    @GeneratedValue(generator = "uuid2")
    @GenericGenerator(name = "uuid2", strategy = "org.hibernate.id.UUIDGenerator")
    @Column(name = "id", columnDefinition = "VARCHAR(255)")
    private UUID id;
Run Code Online (Sandbox Code Playgroud)


小智 10

你可以使用像@PrePersist这样的事件来填充UUID字段 https://docs.jboss.org/hibernate/orm/4.0/hem/en-US/html/listeners.html

但为什么在创建对象时不分配uuid uuid = UUID.randomUUID()?

  • > 但是为什么在创建对象时不分配 uuid uuid = UUID.randomUUID() ?因为有时您需要支持其他不使用休眠并直接插入的工具 (2认同)

小智 8

框架中有很多变化,并在 Spring Boot 2.2.5 和 MySQL v5.7 中进行了测试(应该适用于所有 2.0 版本,但需要检查)可以像下面这样自动生成 UUID

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="id", insertable = false, updatable = false, nullable = false)
private UUID id;
Run Code Online (Sandbox Code Playgroud)

这将以紧凑的方式以二进制格式存储它(有利于存储)。如果出于某种原因需要将 UUID 存储在 Varchar 字段中作为人类可读(破折号分隔值),则可以按如下方式完成

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Type(type="uuid-char")
@Column(name="id", columnDefinition = "VARCHAR(255)", insertable = false, updatable = false, nullable = false)
private String id;
Run Code Online (Sandbox Code Playgroud)

默认情况下,Hibernate 将 UUID 映射为二进制格式,因此要更改格式,我们需要使用 Type 注释提供提示。


Tur*_*tan 7

以下对我有用:

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