gpt4 book ai didi

java - 在二进制数据库列中存储 Java UUID,Hibernate/JPA 与原始 JDBC

转载 作者:行者123 更新时间:2023-11-29 11:26:23 25 4
gpt4 key购买 nike

Hibernate/JPA 的 UUID

我长期以来一直习惯在二进制数据库列中存储 UUID 值(例如 PostgreSQL 的 BYTEA,MySQL 的 BINARY(16))。使用 Hibernate 和 JPA 时,我可以像这样注释我的实体字段...

@Id
@Column(name = "id", columnDefinition = "BINARY(16)")
private UUID id;

...而且它确实有效。

UUID 与 JDBC

在我需要使用 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。但是,如果我:

  1. 使用 JDBC 读取最初由 Hibernate/JPA 编写的 UUID,并且
  2. 让我的 JDBC 代码在其他地方写入相同的 UUID,然后
  3. JDBC 代码存储在 MySQL 中的值原始值不匹配!

有人曾经见过这个,或者有任何理论吗?我不完全理解 Hibernate/JPA 如何在幕后序列化 UUID 值,因此我不确定我可能需要对原始 JDBC 代码进行哪些不同操作才能产生相同的结果。

谢谢!

最佳答案

答案可以在 Mysql Documentation for Binary and Varbinary 中找到。 。

The BINARY and VARBINARY types are similar to CHAR and VARCHAR, except that they contain binary strings rather than nonbinary strings. That is, they contain byte strings rather than character strings. This means that they have no character set, and sorting and comparison are based on the numeric values of the bytes in the values.

mysql中的Binary存储的是二进制字符串,即字节字符串而不是字符。

如果你想按原样使用 UUID,你最好在 mysql 和 postgresql 中使用 VARCHAR 类型。

声明

@Id
@Column(name = "id")
private String id;

写入数据库

PreparedStatement ps = new PreparedStatement("INSERT INTO foo (id) VALUES (?)");
ps.setObject(1, uuid.toString());

从数据库读取。

while (rs.net() {
UUID id = UUID.fromString(rs.getString("id"));
}

关于java - 在二进制数据库列中存储 Java UUID,Hibernate/JPA 与原始 JDBC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38135359/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com