使用 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 here 在 org.hibernate.annotations.Type
的不同用例中提供更多示例
我看到了一篇关于在 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 here 在 org.hibernate.annotations.Type