通过注释使用Hibernate UUIDGenerator

时间:2011-06-15 11:14:13

标签: java hibernate annotations uuid

我正在使用我的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的生成器。我看到一些人用它作为“hibernate-uuid” - 所以这就是我尝试过的,但结果是否定的:

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

8 个答案:

答案 0 :(得分:95)

应为uuid2

...
@GenericGenerator(name = "uuid", strategy = "uuid2")
...

请参阅5.1.2.2.1. Various additional generators

答案 1 :(得分:16)

HibernateDoc表示您可以使用以下内容:

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

我希望您使用的是Hibernate 3.5。

答案 2 :(得分: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"。

答案 3 :(得分:5)

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

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

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

答案 4 :(得分:3)

  

Unknown Id.generator:hibernate-uuid

{{1}}

答案 5 :(得分:2)

这将使用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 + obj标头)。

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

在Hibernate 5.3上测试

答案 6 :(得分: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已弃用。

答案 7 :(得分:0)

在当前的5.4.2 Hibernate版本中,

如果您想要数据库表中的人类可读 varchar(36)字段,
也是Java类中的 Serializable UUID 数据类型,
您可以同时使用@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;