通过注释使用Hibernate UUIDGenerator


77

我使用我的uuid如下:

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

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

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

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

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

Answers:



17

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只是Generator的名称,请参见第3行。在第2行中引用了它。
CSchulz

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”。


8

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

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

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


或者您也可以添加@Type(type="uuid-char")注释以使用VARCHAR(36)
Sergey Ponomarev,

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;
}

4

这将使用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字节,而字符串为32字节(即两个longs + obj标头)UUID

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

在Hibernate 5.3上测试


1

在当前的5.4.2 Hibernate版本中,

如果你想要一个人类可读的 VARCHAR(36)在数据库表字段,
也是一个序列化的 UUID在Java类数据类型,
可以使用@Type(type = "uuid-char") 在同一时间你宣布你的字段成员java.util.UUID的类型。

注意,@Column(length = 36)在MySQL中将字段长度从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,VARCHAR(36)在SQL中,并且弹簧引导2.1.1)
佐尔坦阿姆洛夫

但我发现这个生成UUID即使给定的实体已经拥有一支由码
佐尔坦阿姆洛夫

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生成器使用批注的正确方法。

注意:不建议使用IT。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.