存储Java UUID';二进制数据库列中的,Hibernate/JPA与原始JDBC UUID与Hibernate/JPA

存储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 (?)");

我一直习惯于在二进制数据库列中存储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 (?)");
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。但是,如果我:

  • 使用JDBC读入最初由Hibernate/JPA编写的UUID,然后
  • 让我的JDBC代码在其他地方编写相同的UUID,然后
  • JDBC代码存储在MySQL中的值与原始值不匹配 以前有没有人见过这个,或者有什么理论?我不完全理解Hibernate/JPA是如何在幕后序列化UUID值的,所以我不确定我可能需要对我的原始JDBC代码做什么不同的处理才能产生相同的结果


    谢谢

    答案可在中找到

    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