2016-07-01 4 views
0
にHibernate/JPAは

私は長いバイナリデータベース列に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の中に保存され

  1. 使用JDBC元々のHibernate/JPAによって書かれたUUIDに読み、そして
  2. は私のJDBCコードを持っているが、他の場所で同じUUIDを書き、その後
  3. 値JDBCコードではではなく、が元の値に一致します!

誰もこれまでこれを見たことがありますか、または理論がありますか?私は、Hibernate/JPAがどのようにしてUUID値をシリアライズしているかを完全には理解していないので、同じ結果を生み出すために私の生のJDBCコードと異なる必要があるかもしれません。

ありがとうございます!

+0

ところで、Postgresはインデックスと主キーを含む[データ型としてUUID(https://www.postgresql.org/docs/current/static/datatype-uuid.html)をサポートします。 JDBCドライバで 'getObject' /' setObject'を使います。 –

答えて

1

答えは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のバイナリは、文字列ではないバイト文字列を格納します。

UUIDをそのまま使用したい場合は、mysqlとpostgresqlの両方でVARCHAR型を使用する方がよいでしょう。 DBから

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

読むをdbに

宣言

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

書き込み。

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

うーん...mysqldumpのエクスポートファイルには16進数のUUID値( 'X'581fc98ce7c447898de130d0b01759e5'')が含まれています。しかし、あなたが示唆したように、 'ResultSet'から文字列として読み込もうとすると、エラーが発生します:' java.lang.IllegalArgumentException:無効なUUID文字列:581fc98ce7c447898de130d0b01759e5'。 –

+0

ああ!問題は、単にMySQLがハイフン*なしでUUID文字列*を格納していることであり、Javaの 'UUID.fromString()'メソッドはハイフンの不足を処理できません。私はこの他のStackOverflowの質問で議論された正規表現と一緒に働いている:http://stackoverflow.com/questions/18986712/creating-a-uuid-from-a-string-with-no-dashes –

+0

すばらしいおかげで詳細なヘルプ! –

関連する問題