UUID を主キーとして使用するエンティティを PostgreSQL に永続化しようとしています。私はそれをプレーンなUUIDとして永続化しようとしました:
@Id
@Column(name = "customer_id")
private UUID id;
上記の場合、次のエラーが発生します。
ERROR: column "customer_id" is of type uuid but expression is of type bytea
Hint: You will need to rewrite or cast the expression.
Position: 137
また、UUIDをbyte []として永続化しようとしましたが、役に立ちませんでした:
@Transient
private UUID id;
@Id
@Column(name = "customer_id")
@Access(AccessType.PROPERTY)
@Lob
protected byte[] getRowId() {
return id.toString().getBytes();
}
protected void setRowId(byte[] rowId) {
id = UUID.fromString(new String(rowId));
}
@Lob を削除すると、上記のエラーと同じエラーが発生します。しかし、@Lob を適用すると、エラーは次のようにわずかに変化します。
ERROR: column "customer_id" is of type uuid but expression is of type bigint
Hint: You will need to rewrite or cast the expression.
Position: 137
こんな簡単なことができないなんて、本当に悔しいです!
PostgreSQL 9.1 で Hibernate 4.1.3.Final を使用しています。
私は多かれ少なかれ同じ問題でSOに関する多くの質問を見てきましたが、それらはすべて古く、簡単な答えはないようです。
いハックに頼ることなく、標準的な方法でこれを達成したいと思います。しかし、これが(醜い)ハックによってのみ達成できるのであれば、それが私がすることかもしれません. ただし、UUID を varchar としてデータベースに保存したくありません。これは、パフォーマンスが良くないためです。また、可能であれば、コードに Hibernate の依存関係を導入したくありません。
どんな助けでも大歓迎です。
更新 1 (2012 年 7 月 3 日午後 12 時 15 分)
まあ、まあ、まあ...JTDSドライバー(v1.2.5)を使用してSQLサーバー2008 R2でまったく同じコード(プレーンUUID、変換なし-上記のコードの最初のバージョン)をテストしたのはちょっと興味深いです。 、それは魅力として機能したと思います(もちろん、persistence.xmlで接続関連の情報を変更する必要がありました)。
さて、これは PostgreSQL 固有の問題ですか、それとも何ですか?