繁体   English   中英

Hibernate 无法将 UUID 插入 VARCHAR 列

[英]Hibernate can't insert UUID to VARCHAR column

我正在建立一个 MySQL 数据库,并为后端使用 Hibernate 和 Play Framework。 我遇到了条目 ID 的问题。 我将我的 id 列定义为VARCHAR(36)

CREATE TABLE `logaritmical`.`users` (
   `id` VARCHAR(36) NOT NULL,
   `username` TEXT NOT NULL,
    `email` TEXT NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE INDEX `id_UNIQUE` (`id` ASC)
);

现在,@Entity @Entity是这样的:

@Entity
@Table(name = "users")
public class UserDO {

   @Id
   @GeneratedValue(generator = "uuid2")
   @GenericGenerator(name = "uuid2", strategy = "uuid2")
   @Column(name = "id", updatable = false, nullable = false, columnDefinition = "VARCHAR(36)")
   private UUID id;
    
   @Column
   private String username;
    
   @Column
   private String email;
}

执行插入时,出现以下错误: Incorrect string value: '\xEF\xA5.\x89\xF3K...' for column 'id' at row 1

如果我将列类型和 columnDefinition 更改为BINARY(16)插入工作,但它的缺点是 ID 在执行选择时不可读。

附加信息: persistence.xml看起来像这样:

<persistence-unit name="defaultPersistenceUnit" transaction-type="RESOURCE_LOCAL">
   <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
   <non-jta-data-source>DefaultDS</non-jta-data-source>
   <properties>
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL8Dialect"/>
   </properties>
</persistence-unit>

数据库配置和库版本如下所示: jpa.default=defaultPersistenceUnit "org.hibernate" % "hibernate-entitymanager" % "5.4.24.Final", "mysql" % "mysql-connector-java" % "8.0.22",

可以做些什么来让UUIDVARCHAR一起工作? 有什么我想念的吗?

尝试使用以下定义:

import org.hibernate.annotations.Type;

@Entity
@Table(name = "users")
public class UserDO {
    @Id
    @GeneratedValue(generator = "uuid2")
    @GenericGenerator(name = "uuid2", strategy = "uuid2")
    @Column(name = "id", updatable = false, nullable = false, columnDefinition = "VARCHAR(36)")
    @Type(type = "uuid-char")
    private UUID id;

    // ...
}

默认情况下,您的方言UUID看起来像映射到uuid-binary 基本类型

PS 请注意,将UUID PK 保存为字符串可能会导致性能问题,如本文所述

除了 9 倍的大小成本(36 对 int 的 4 个字节)之外,字符串的排序不如数字快,因为它们依赖于排序规则。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM