我试图在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
我还try 将UUID持久化为字节[],但没有成功:
@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.最终版本为PostgreSQL 9.1.
我看到过很多关于同一问题的问题,但都是老问题,似乎没有一个直接的答案.
我想以一种标准的方式实现这一点,而不是诉诸丑陋的黑客手段.但如果这只能通过(丑陋的)黑客来实现,那么我可能会这么做.但是,我不想将UUID作为varchar存储在数据库中,因为这对性能不好.此外,如果可能的话,我不想在代码中引入Hibernate依赖项.
任何帮助都将不胜感激.
UPDATE 1(2012-07-03下午12:15)
好吧,好吧,好吧...有趣的是,我使用JTDS驱动程序(v1.2.5)在SQLServer2008R2上测试了完全相同的代码(纯UUID,无转换——上面发布的代码的第一个版本),猜猜看,它很有魅力(当然我必须在persistence.xml中更改与连接相关的信息).
现在,这是一个特定于PostgreSQL的问题还是什么?