我正在尝试在 PostgreSQL 中保留一个使用 UUID 作为主键的实体。我尝试将其作为普通 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
不能做这么简单的事情,我感觉非常糟糕!
我正在使用 Hibernate 4.1.3.Final 和 PostgreSQL 9.1。
我已经或多或少地看到了许多关于相同问题的问题,但它们都很老,似乎没有一个直接的答案。
我想以一种标准的方式来实现这一点,而不是诉诸丑陋的黑客。但是,如果这只能通过(丑陋的)黑客来实现,那么这就是我要做的。但是,我不想将 UUID 作为 varchar 存储在数据库中,因为这不利于性能。另外,如果可能的话,我不想在我的代码中引入 Hibernate 依赖项。
任何帮助将不胜感激。
更新 1 (2012-07-03 12:15 pm)
嗯,嗯,嗯......这有点有趣,我使用 JTDS 驱动程序(v1.2.5)和 SQL Server 2008 R2 测试了完全相同的代码(纯 UUID,没有转换——上面发布的代码的第一个版本)和,你猜怎么着,它就像一个魅力(当然我必须在persistence.xml 中更改与连接相关的信息)。
现在,它是特定于 PostgreSQL 的问题还是什么?