【发布时间】:2016-11-03 06:32:19
【问题描述】:
Hibernate/JPA 的 UUID
我一直习惯于将 UUID 值存储在二进制数据库列中(例如,BYTEA 用于 PostgreSQL,BINARY(16) 用于 MySQL)。使用 Hibernate 和 JPA 时,我可以像这样注释我的实体字段...
@Id
@Column(name = "id", columnDefinition = "BINARY(16)")
private UUID id;
...它只是工作。
带有 JDBC 的 UUID
在我需要编写使用 JDBC 的情况下,我编写了这样的 UUID 值...
PreparedStatement ps = new PreparedStatement("INSERT INTO foo (id) VALUES (?)");
ps.setObject(1, uuid, Types.BINARY)
...并像这样读取 UUID 值...
while (rs.net() {
UUID id = UUID.nameUUIDFromBytes(rs.getBytes("id"));
}
混搭?
最近我拿了一个 Hibernate/JPA 应用程序使用的 MySQL 数据库,用mysqldump 工具导出和导入它,并尝试使用一些原始 JDBC 代码使用数据。 Hibernate/JPA 代码和读写 UUID,原始 JDBC 代码可以读写 UUID。但是,如果我:
- 使用 JDBC 读取最初由 Hibernate/JPA 编写的 UUID,并且
- 让我的 JDBC 代码在别处写入相同的 UUID,然后
- JDBC 代码存储在 MySQL 中的值与原始值不匹配!
有没有人以前见过这个,或者有任何理论?我不完全理解 Hibernate/JPA 如何在幕后序列化 UUID 值,所以我不确定我可能需要对原始 JDBC 代码做些什么来产生相同的结果。
谢谢!
【问题讨论】:
-
顺便说一句,Postgres 支持UUID as a data type,包括索引和主键。在 JDBC 驱动中使用
getObject/setObject。
标签: java mysql hibernate jpa jdbc