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
class是这样的:
@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",
如何才能让 UUID
与 VARCHAR
一起工作?有什么我想念的吗?
尝试使用以下定义:
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
basic type。
P.S。请注意,将 UUID
PK 保存为字符串可能会导致性能问题,如 this article:
中所述
Aside from the 9x cost in size (36 vs. 4 bytes for an int), strings don’t sort as fast as numbers because they rely on collation rules.
我正在努力建立一个 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
class是这样的:
@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",
如何才能让 UUID
与 VARCHAR
一起工作?有什么我想念的吗?
尝试使用以下定义:
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
basic type。
P.S。请注意,将 UUID
PK 保存为字符串可能会导致性能问题,如 this article:
Aside from the 9x cost in size (36 vs. 4 bytes for an int), strings don’t sort as fast as numbers because they rely on collation rules.