通过注解使用Hibernate UUID生成器

88

我正在使用我的uuid,如下所示:

@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid")
@Column(name = "uuid", unique = true)
private String uuid;

但我收到了一个智能 Hibernate 警告:

使用不生成符合 IETF RFC 4122 的 UUID 值的 org.hibernate.id.UUIDHexGenerator,请考虑改用 org.hibernate.id.UUIDGenerator

因此,我想切换到 org.hibernate.id.UUIDGenerator,现在我的问题是如何告诉它给 Hibernate 的生成器。我看到有人将其用作“hibernate-uuid”,所以这就是我尝试过的,但结果是负面的:

@Id
@GeneratedValue(generator = "hibernate-uuid")
@GenericGenerator(name = "hibernate-uuid", strategy = "hibernate-uuid")
@Column(name = "uuid", unique = true)
private String uuid;
8个回答

117

4
同样适用于4.1版本。另外,请注意它使用了java.util.UUID.randomUUID()。 - CorayThan
29
在Hibernate 5+版本中,简单的@Id @GeneratedValue private java.util.UUID id;代码可以正常工作。参考文档 - Natan Cox
1
strategy = "uuid"strategy = "uuid2" 有什么区别? - Olivier Boissé
@OlivierBoissé- 这应该会有所帮助 https://dev59.com/ToLba4cB1Zd3GeqPdFQb - Vipul Jain
@GenericGenerator策略属性自hibernate-core 6.2版本起已被弃用,您不再需要它。 - undefined

24

正如@natan在评论中指出的那样,如果您正在使用Hibernate 5,则以下代码就足够了:

如上所述

@Id 
@GeneratedValue
private java.util.UUID id;

在MySQL或其他SQL实现中,使用BINARY(16)类型定义id列。


1
或者您可以添加@Type(type="uuid-char")注释来使用VARCHAR(36)列。 - Sergey Ponomarev
针对PostgreSQL @Type(type="pg-uuid") :D - Akif Hadziabdic
@senjin.hajrulahovic 我正在使用Hibernate 5.6.15.final版本。当我尝试使用这个配置插入表时,抛出异常:cause by: java.sql.sqlexception: field 'id' doesn't have a default value,并且执行停止。生成的DDL如下:创建表regions ( ID Binary (255) Not Null, Name Varchar (255) not null, Primary Key (ID) ) Engine = Innodb Default CHARSET = UTF8Collate = UTF8MB4_0900_AI_CI 数据库中似乎一切正常,这让我相信Hibernate没有自动通过将数据插入表来生成ID字段。 - Toms_Hd3z
@senjin.hajrulahovic 我正在使用Hibernate 5.6.15.final版本。当我尝试使用这个配置插入表时,抛出异常:cause by: java.sql.sqlexception: field 'id' doesn't have a default value,并且执行停止。生成的DDL语句如下:创建表regions ( ID Binary (255) Not Null, Name Varchar (255) not null, Primary Key (ID) ) Engine = Innodb Default CHARSET = UTF8Collate = UTF8MB4_0900_AI_CI 数据库中似乎一切正常,这让我相信Hibernate没有自动通过向表中插入数据来生成ID字段。 - undefined

22

HibernateDoc指出,您可以使用以下内容:

@Id
@GeneratedValue(generator="system-uuid")
@GenericGenerator(name="system-uuid", strategy = "uuid")
@Column(name = "uuid", unique = true)
private String uuid;

我希望你正在使用Hibernate 3.5版本。


"system-uuid" 只是生成器的名称,参见第三行。在第二行中引用了它。 - CSchulz
@GenericGenerator策略属性自hibernate-core 6.2版本起已被弃用,您不再需要它。 - undefined

11

尝试...

@Id
@GeneratedValue(generator = "uuid2")
@GenericGenerator(name = "uuid2", strategy = "uuid2")
@Column(name = "uuid", columnDefinition = "BINARY(16)")
public UUID getId()
{
    return id;
}

public void setId(UUID i)
{
    id = i;
}

请注意 "uuid2" 与 "uuid" 的区别。


@GenericGenerator策略属性自hibernate-core 6.2版本起已被弃用,您不再需要它。 - undefined

5

这将使用 UUID v4,自动生成的 uuid 将像往常一样存储在列中,类型为 varchar(36)

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

这会对性能产生一定的影响:

  • 占用空间大于 BINARY(16)
  • 在解析后,java.lang.String 实例所占内存比 java.util.UUID 更多:UUID 字符串为 112 字节,而 UUID 仅为 32 字节(即两个 long 类型和对象头)。

但使用字符串类型的 UUID 更加方便 - 更容易编写查询,并且可以查看表的内容。

在 Hibernate 5.3 上测试通过。


1
@GenericGenerator策略属性自hibernate-core 6.2版本起已被弃用,您不再需要它。 - undefined

4
未知的ID生成器:hibernate-uuid
@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "org.hibernate.id.UUIDGenerator")
@Column(name = "id", unique = true)
public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

3

在当前的5.4.2 Hibernate版本中,

如果你想要一个在数据库表中可读性强的varchar(36)字段,
但是在Java类中也需要可序列化的UUID数据类型,
你可以使用@Type(type="uuid-char")java.util.UUID类型声明你的字段成员同时

请注意,在MySQL中使用@Column(length=36)来将字段长度从255缩减到36非常重要。

请注意,在PostgreSQL中应该使用@Type(type="pg-uuid")代替。

import org.hibernate.annotations.Type
import java.util.UUID
import javax.persistence.Column
import javax.persistence.GeneratedValue
import javax.persistence.Id

@Id @GeneratedValue
@Type(type = "uuid-char") @Column(length = 36)
private UUID id;

终于成功了,谢谢! :) (在Java中使用UUID,在SQL中使用varchar(36),以及Spring Boot 2.1.1) - Zoltán Umlauf
尽管我发现即使给定实体已经有一个UUID,这仍会生成一个UUID。 - Zoltán Umlauf

0
@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid")
@Column(name = "UUID_ID")
public String getId(){
return id;
}

这是在Hibernate 5.0.11.FINAL中使用注释生成uuid生成器的正确方法。

注意:它已被弃用。


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