通过注释使用 Hibernate UUIDGenerator

我使用的 uuid 如下:

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

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

吸毒 Org.hibernate.id.UUIDHexGenerator 它不生成 IETF RFC4122 符合 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;
118034 次浏览

HibernateDoc says you can use following:

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

I hope you are using Hibernate 3.5.

It should be uuid2:

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

See 5.1.2.2.1. Various additional generators.

Try...

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

Note the "uuid2" as opposed to "uuid".

Unknown 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;
}
@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid")
@Column(name = "UUID_ID")
public String getId(){
return id;
}

This is the proper way to use annotation for uuid generators in Hibernate 5.0.11.FINAL.

Note: IT is deprecated.

As @natan pointed out in a comment, if you are using Hibernate 5 the below code is sufficient:

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

Define the id column with the type of BINARY(16) in MySQL or it's equivalent in other SQL implementations.

This will use UUID v4 and the auto generated uuid will be stored in the column as usual varchar(36):

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

This should have some performance impact:

  • consumed size is more than BINARY(16)
  • after hydration the java.lang.String instance consumes more memory than java.util.UUID: 112 bytes for UUID as string versus 32 bytes (i.e. two longs + obj header) for UUID.

But it's much more easier to work with string'ed UUID - easier to write queries and you can see the contents of the table.

Tested on Hibernate 5.3

With current 5.4.2 Hibernate version,

if you want a Human-Readable varchar(36) field in the database table,
but also a Serializable UUID data type in your Java Class,
you can use @Type(type = "uuid-char") at the same time you declare your field member with java.util.UUID type.

Note that @Column(length = 36) is important to reduce from 255 to 36 the field length in MySQL.

Note that with PostgreSQL you should use @Type(type = "pg-uuid") instead.

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;