gpt4 book ai didi

java - 使用 JPA 在 PostgreSQL 中持久化 UUID

转载 作者:IT老高 更新时间:2023-10-28 20:25:39 26 4
gpt4 key购买 nike

我正在尝试在 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.0)在 SQL Server 2008 R2 上测试了完全相同的代码(纯 UUID,没有转换——上面发布的代码的第一个版本)。 2.5),你猜怎么着,它就像一个魅力(当然我必须在persistence.xml中更改与连接相关的信息)。

现在,这是 PostgreSQL 特有的问题还是什么?

最佳答案

不幸的是,PostgreSQL JDBC 驱动程序选择了一种表示非 JDBC 标准类型代码的方式。他们只是将所有这些映射到 Types.OTHER。长话短说,您需要启用特殊的 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;

另一个(更好的)选项是将 org.hibernate.type.PostgresUUIDType 注册为所有作为 java.util.UUID 公开的属性的默认 Hibernate 类型映射。这在文档@ http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html/ch06.html#types-registry 中有介绍。

关于java - 使用 JPA 在 PostgreSQL 中持久化 UUID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11284359/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com