我试图在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的问题还是什么?

推荐答案

PostgreSQL JDBC驱动程序 Select 了一种不幸的方式来表示非JDBC标准类型代码.它们只是将所有这些映射到类型.另外长话短说,您需要启用一个特殊的Hibernate类型映射来处理UUID映射(到postgres特定UUID数据类型的列):

@Id
@Column(name = "customer_id")
@org.hibernate.annotations.Type(type="org.hibernate.type.PostgresUUIDType")
private UUID id;

或者更简洁地说:

@Id
@Column(name = "customer_id")
@org.hibernate.annotations.Type(type="pg-uuid")
private UUID id;

另一个(更好的) Select 是注册组织.冬眠类型PostgresUUIDType作为所有作为java公开的属性的默认Hibernate类型映射.util.乌伊德.文档@http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html/ch06.html#types-registry中包含了这一点

Postgresql相关问答推荐

org.postgresql. util.PSQLException:使用docker + docker—compose + kafka + springboot时try 连接失败

处理Ruust-DIESEL中的Jsonb PostgreSQL列

GORM Golang SQL查询执行不区分大小写的搜索不起作用

在rust中,有什么方法可以从sqlx::query_with中返回rows_infected以及行本身?

Postgres 对 WHERE 子句并行使用两个索引

忽略 split_part 的第 n 个分隔符之后

PostgreSQL:在 select 和 group by 中使用不同的列不会导致错误

PostgreSQL 连接字符串的正则表达式

Ubuntu 上的 PostgreSQL 安装:找不到initdb命令

使用 WHERE 子句创建递归视图

Postgres数据库系统已准备好接受连接和docker compose

有没有办法共享数据或监控复杂 PostgresQL 事务的进度?

@符号在yacc中的函数中是什么意思

PostGIS - 将多面体转换为单面体

处理用户发送的string contains null byte

使用 PostgreSQL 的 Linq To Sql

如何使用 PostgreSQL 在任何列中查找所有具有 NULL 值的行

PostgreSQL regexp_replace() 只保留一个空格

PostgreSQL 无法启动:server.key具有组或世界访问权限

Ruby 中 DateTime 的毫秒分辨率