hibernate无法将uuid插入varchar列

huus2vyu  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(334)

我正在建立一个mysql数据库,并在后端使用hibernate和play框架。我的条目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
@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 如果我将列类型和列定义更改为 BINARY(16) insert可以工作,但是它的缺点是在执行select时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", 我们能做些什么来获得 UUID 使用 VARCHAR ? 有什么我不知道的吗?

zbsbpyhn

zbsbpyhn1#

尝试使用以下定义:

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 默认情况下,Map到 uuid-binary 基本类型。
p、 请注意 UUID pk作为字符串可能会导致性能问题,本文对此进行了解释:
除了9倍大小的开销(整型36字节比4字节),字符串的排序速度不如数字快,因为它们依赖于排序规则。

相关问题