我正在使用我的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;
它应该是uuid2
:
...
@GenericGenerator(name = "uuid", strategy = "uuid2")
...
HibernateDoc说你可以使用以下:
@Id
@GeneratedValue(generator="system-uuid")
@GenericGenerator(name="system-uuid", strategy = "uuid")
@Column(name = "uuid", unique = true)
private String uuid;
我希望你使用的是Hibernate 3.5。
尝试...
@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”。
正如@natan在评论中指出的那样,如果您使用的是Hibernate 5,则以下代码就足够了:
@Id
@GeneratedValue
private java.util.UUID id;
在MySQL中使用id
的类型定义BINARY(16)
列,或者在其他SQL实现中它是等效的。
未知的Id.generator: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;
}
这将使用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头)。但是使用string'ed UUID更容易 - 更容易编写查询,你可以看到表的内容。
在Hibernate 5.3上测试过
使用当前的5.4.2 Hibernate版本,
如果你想在数据库表中有一个Human-Readable 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;
@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已弃用。