使用 JPA 将 UUID 作为字符串存储在 mysql 中

Storing UUID as string in mysql using JPA

我看到了一篇关于在 Hibernate 和 MySql 中使用 UUID 的博客。现在的问题是,每当我查看数据库时,ID 都将是不可读格式 (binary-16)。如何将 UUID 存储为可读格式,如 7feb24af-fc38-44de-bc38-04defc3804fe 而不是 ¡7ôáßEN¹º}ÅÑs

我正在使用此代码

@Id
@GeneratedValue( generator = "uuid2" )
@GenericGenerator( name = "uuid2", strategy = "uuid2" )
@Column( name = "id", columnDefinition = "BINARY(16)" )
private UUID id;

结果是 ¡7ôáßEN¹º}ÅÑs。但我希望它是可读的 UUID,所以我使用了以下对我没有帮助的代码

@Id
@GeneratedValue( generator = "uuid2" )
@GenericGenerator( name = "uuid2", strategy = "uuid2" )
@Column( name = "id", columnDefinition = "CHAR(32)" )
private UUID id;

如何在不更改 java 类型 UUID

的情况下将 UUID 保存为字符串而不是二进制文件(16)

随便用 @org.hibernate.annotations.Type(type="uuid-char")

数据类型分为三级:
- Java 类型
- Hibernate 的类型
- 数据库特定类型。

Hibernate 数据类型表示是 Java 数据类型和数据库类型之间的桥梁,以独立于数据库。

你可以检查这个mappings。 如您所见,java.util.UUID 可以映射到不同的类型(二进制或 char/varchar)。 uuid-binary 是 hibernate 的 UUIDBinaryType 的关键,你默认得到这个类型,它将被映射到你的数据库的 BINARY

如果你想在你的UUID下得到CHAR类型,你应该向hibernate说明你想要他的UUIDCharType。为此,您可以使用 uuid-char 键,并且您可以查看 Java@Type 注释的文档:Defines a Hibernate type mapping.。所以,你用注解来解释hibernate应该使用哪个网桥。

我在上一个项目中遇到了同样的问题(spring-boot:2.5.3 + mariaDB).
所以我添加了以下注释@Type(type = "org.hibernate.type.UUIDCharType")来修复它。

import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Type;

import javax.persistence.*;
import java.util.UUID;
/** imports */

@Entity()
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(generator = "UUID")
    @GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator")
    @Column(name = "uuid", columnDefinition = "char(36)")
    @Type(type = "org.hibernate.type.UUIDCharType")
    private UUID uuid;

   /** ... */
}

hibernate注解@Type的目的是定义数据库中存储的数据类型,与上一行兼容@Column(name = "uuid", columnDefinition = "char(36)")

While googling it, I noticed that mariaDB & MySQL have the same issue.

您可以 see hereorg.hibernate.annotations.Type

的不同用例中提供更多示例