通过注释使用Hibernate UUIDGenerator

问题描述 投票:67回答:8

我正在使用我的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;
java hibernate annotations uuid
8个回答
95
投票

它应该是uuid2

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

5.1.2.2.1. Various additional generators


16
投票

HibernateDoc说你可以使用以下:

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

我希望你使用的是Hibernate 3.5。


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


6
投票

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

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

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


3
投票

未知的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;
}

3
投票

这将使用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上测试过


2
投票

使用当前的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;

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已弃用。

© www.soinside.com 2019 - 2024. All rights reserved.