【问题标题】:How to Generate an auto UUID using Hibernate on spring boot如何在 Spring Boot 上使用 Hibernate 生成自动 UUID
【发布时间】:2017-12-18 14:38:09
【问题描述】:

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

但是当数据库插入完成时。 “uuid”为空。

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

【问题讨论】:

  • 请发布您的 UUID 课程。
  • @GeneratedValue 和其他字段仅用于@Id 字段,对于其他字段,它们将被忽略。
  • @M.Deinum 那么替代方案(解决方案)是什么?你的答案不完整

标签: hibernate jpa spring-boot uuid


【解决方案1】:

你可以试试吗?

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • > 但是为什么在创建对象时不分配 uuid uuid = UUID.randomUUID() ?因为有时你需要支持其他不使用休眠并直接插入的工具
    【解决方案3】:

    框架中有很多变化,并且在 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;
    

    这将以二进制格式以紧凑的方式存储它(有利于存储)。如果由于某种原因需要将 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 注释提供提示。

    【讨论】:

      【解决方案4】:

      以下对我有用:

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

      【讨论】:

        猜你喜欢
        • 2023-02-17
        • 2017-11-23
        • 1970-01-01
        • 2018-08-14
        • 2017-06-24
        • 2015-04-02
        • 2018-12-03
        • 2014-02-02
        • 2017-10-09
        相关资源
        最近更新 更多