私は長いバイナリデータベース列にUUID値を格納するaccustomingされていると保管JavaのUUIDのバイナリデータベース列内に、Hibernate/JPA対生JDBC
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
ツールでエクスポートしてインポートし、いくつかのraw JDBCコードでデータを使用しようとしました。 Hibernate/JPAコードと読み書きUUID、そして生のJDBCコードはUUIDを読み書きできます。しかし、I場合:MySQLの中に保存され
- 使用JDBC元々のHibernate/JPAによって書かれたUUIDに読み、そして
- は私のJDBCコードを持っているが、他の場所で同じUUIDを書き、その後
- 値JDBCコードではではなく、が元の値に一致します!
誰もこれまでこれを見たことがありますか、または理論がありますか?私は、Hibernate/JPAがどのようにしてUUID値をシリアライズしているかを完全には理解していないので、同じ結果を生み出すために私の生のJDBCコードと異なる必要があるかもしれません。
ありがとうございます!
ところで、Postgresはインデックスと主キーを含む[データ型としてUUID(https://www.postgresql.org/docs/current/static/datatype-uuid.html)をサポートします。 JDBCドライバで 'getObject' /' setObject'を使います。 –