存储Java UUID';二进制数据库列中的,Hibernate/JPA与原始JDBC UUID与Hibernate/JPA
我一直习惯于在二进制数据库列中存储UUID值(例如,PostgreSQL的存储Java UUID';二进制数据库列中的,Hibernate/JPA与原始JDBC UUID与Hibernate/JPA,java,mysql,hibernate,jpa,jdbc,Java,Mysql,Hibernate,Jpa,Jdbc,我一直习惯于在二进制数据库列中存储UUID值(例如,PostgreSQL的BYTEA,MySQL的binary(16))。当使用Hibernate和JPA时,我可以像这样注释我的实体字段 @Id @Column(name = "id", columnDefinition = "BINARY(16)") private UUID id; PreparedStatement ps = new PreparedStatement("INSERT INTO foo (id) VALUES (?)");
BYTEA
,MySQL的binary(16)
)。当使用Hibernate和JPA时,我可以像这样注释我的实体字段
@Id
@Column(name = "id", columnDefinition = "BINARY(16)")
private UUID id;
PreparedStatement ps = new PreparedStatement("INSERT INTO foo (id) VALUES (?)");
ps.setObject(1, uuid, Types.BINARY)
while (rs.net() {
UUID id = UUID.nameUUIDFromBytes(rs.getBytes("id"));
}
。。。而且它很有效
UUID与JDBC
在我需要使用JDBC编写的情况下,我编写了如下UUID值
@Id
@Column(name = "id", columnDefinition = "BINARY(16)")
private UUID id;
PreparedStatement ps = new PreparedStatement("INSERT INTO foo (id) VALUES (?)");
ps.setObject(1, uuid, Types.BINARY)
while (rs.net() {
UUID id = UUID.nameUUIDFromBytes(rs.getBytes("id"));
}
。。。然后像这样读取UUID值
@Id
@Column(name = "id", columnDefinition = "BINARY(16)")
private UUID id;
PreparedStatement ps = new PreparedStatement("INSERT INTO foo (id) VALUES (?)");
ps.setObject(1, uuid, Types.BINARY)
while (rs.net() {
UUID id = UUID.nameUUIDFromBytes(rs.getBytes("id"));
}
混搭?
最近,我获取了一个Hibernate/JPA应用程序使用的MySQL数据库,使用mysqldump
工具将其导出和导入,并尝试将数据与一些原始JDBC代码一起使用。Hibernate/JPA代码可以读取和写入UUID,而原始JDBC代码可以读取和写入UUID。但是,如果我:
谢谢 答案可在中找到 mysql中的二进制存储二进制字符串,即字节字符串而不是字符 如果您想按原样使用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"));
}
隐马尔可夫模型。。。来自的mysqldump导出文件包含一个十六进制UUID值:
X'581fc98ce7c447898de130d0b01759e5'
。但是,当我尝试按照您的建议将其作为字符串从ResultSet
中读取时,我得到了错误:java.lang.IllegalArgumentException:Invalid UUID string:581fc98ce7c44788de130d0b01759e5
。啊!问题很简单,MySQL存储的UUID字符串没有连字符,Java的UUID.fromString()
方法无法处理缺少连字符的问题。我让它与在另一个StackOverflow问题中讨论的正则表达式一起工作:感谢您快速而详细的帮助!顺便说一句,Postgres支持索引和主键。在JDBC驱动程序中使用getObject
/setObject
。