使用Hibernate/JPA的UUID
长期以来,我一直习惯于将UUID值存储在二进制数据库列中(例如,BYTEA
表示PostgreSQL,BINARY(16)
表示MySQL)。当使用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。
以前有没有人见过这个,或者说过什么理论?我不完全理解Hibernate/JPA是如何在封面下序列化UUID值的,所以我不确定我可能需要用我的原始JDBC代码做什么来产生相同的结果。
谢谢!
发布于 2016-07-01 01:05:08
答案可以在用于二进制和Var二进制的Mysql文档中找到。
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中存储二进制字符串,这意味着字节字符串而不是字符。
如果您想按原样使用UUID,最好在mysql和postgresql中都使用VARCHAR类型。
申报
@Id
@Column(name = "id")
private String id;
写到db
PreparedStatement ps = new PreparedStatement("INSERT INTO foo (id) VALUES (?)");
ps.setObject(1, uuid.toString());
从分局读。
while (rs.net() {
UUID id = UUID.fromString(rs.getString("id"));
}
https://stackoverflow.com/questions/38135359
复制相似问题