通过注释使用Hibernate UUIDGenerator

Mar*_*tin 69 java uuid annotations hibernate

我正在使用我的uuid如下:

@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid")
@Column(name = "uuid", unique = true)
private String uuid;
Run Code Online (Sandbox Code Playgroud)

但我得到了一个聪明的Hibernate警告:

使用org.hibernate.id.UUIDHexGenerator,它不生成符合IETF RFC 4122的UUID值; 考虑使用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;
Run Code Online (Sandbox Code Playgroud)

axt*_*avt 101

它应该是uuid2:

...
@GenericGenerator(name = "uuid", strategy = "uuid2")
...
Run Code Online (Sandbox Code Playgroud)

5.1.2.2.1.各种附加发电机.

  • 一个简单的`@Id @GeneratedValue私有java.util.UUID id;`适用于Hibernate 5+.参见[文档](http://docs.jboss.org/hibernate/orm/5.0/userguide/html_single/Hibernate_User_Guide.html#identifiers). (21认同)
  • [这与4.1相同](http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html_single/#mapping-declaration-id).另请注意,它使用java.util.UUID.randomUUID(). (4认同)

CSc*_*ulz 16

HibernateDoc说你可以使用以下内容:

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

我希望你使用的是Hibernate 3.5.


ker*_*vin 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;
}
Run Code Online (Sandbox Code Playgroud)

注意"uuid2"而不是"uuid".


sen*_*vic 8

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

@Id 
@GeneratedValue
private java.util.UUID id;
Run Code Online (Sandbox Code Playgroud)

在MySQL中定义id列的类型,BINARY(16)或者在其他SQL实现中等效。


sto*_*ito 5

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

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

这应该会对性能产生一些影响:

  • 消耗的尺寸大于BINARY(16)
  • 水合后,java.lang.String实例消耗的内存多于java.util.UUID:UUID 作为字符串为 112 字节,而UUID.

但使用字符串 UUID 更容易 - 更容易编写查询,并且您可以看到表的内容。

在 Hibernate 5.3 上测试

  • 自 hibernate-core 6.2 起,@GenericGenerator 策略属性已被弃用。你不再需要它了。 (2认同)