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

时间:2017-07-13 17:00:55

标签: hibernate jpa spring-boot uuid

我想要实现的是生成在数据库插入期间自动分配的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;

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

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

4 个答案:

答案 0 :(得分:13)

你能试试吗?

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

答案 1 :(得分:8)

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

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

答案 2 :(得分:5)

在框架中进行了很多更改,并在带有MySQL v5.7的Spring Boot 2.2.5中进行了测试(应该与所有2.0版本兼容,但需要检查)UUID可以像下面那样自动生成

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

这将以紧凑的方式将其以二进制格式存储(便于存储)。如果出于某种原因需要将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;

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

答案 3 :(得分:0)

以下为我工作:

MyWebVisuDlls