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

2022-09-02 19:31:55

我遇到了一个将UUID与Hibernate和MySql一起使用的博客。现在的问题是,每当我查看数据库时,ID都将是不可读的格式(二进制-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)


答案 1

只需使用@org.hibernate.annotations.Type(type="uuid-char")

有三个级别的数据类型:
- Java类型
- 休眠的类型
- 数据库特定类型。

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

您可以检查此映射。正如你所发现的,可以映射到不同的类型(二进制或字符/varchar)。 是休眠的UUIDBinaryType的关键,默认情况下你会得到这个类型,它将映射到你的数据库。java.util.UUIDuuid-binaryBINARY

如果你想在你的UUID下获得CHAR类型,你应该解释休眠,你想要他的.为此,您可以使用 key,您可以签入 javaDoc 的 @Type 注释:。因此,您可以使用注释来解释休眠它应该使用哪个桥。UUIDCharTypeuuid-charDefines a Hibernate type mapping.


答案 2

我在上一个项目中遇到了同样的问题(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;

   /** ... */
}

休眠注释的目的是定义存储在数据库中的数据类型,并且它与上一行兼容@Type@Column(name = "uuid", columnDefinition = "char(36)")

在谷歌搜索时,我注意到mariaDB和MySQL有同样的问题。

您可以在此处查看不同用例中的更多示例org.hibernate.annotations.Type