当前位置: 首页 > 面试题库 >

使用JPA在PostgreSQL中保留UUID

戈念
2023-03-14
问题内容

我试图在使用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

无法完成如此简单的操作,我感到非常难过!

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


问题答案:

不幸的是,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中对此进行了介绍



 类似资料:
  • 问题内容: 我有一个名为“ Group”的实体类,NetBeans警告我“实体表名称是保留的Java Persistence QL关键字”。 类似的情况是使用保留的SQL关键字。 这个名字会被转义吗?使用其他表名可以解决@Table(name =“ otherName”)的问题。还是应该重命名课程? 问题答案: 这个名字会被转义吗? 有 没有 在JPA规范是这么说的,如果您的提供商做,这是供应商特

  • 问题内容: 在我当前的项目中,我正在使用没有JPA批注的第三方库。 如何使用JPA和外部映射持久化该库中的对象? 问题答案: 检查这个和这个。简而言之: 创造 跟随(阅读) 您不必手动映射每列-只需提供一些细节(即集合和ID)。假定所有字段都是列(如果映射了类)。如果没有集合,则可以使用如下所示的内容: 请注意,指定时不需要完全限定的名称。 如果您想要的文件名称不同于,则可以通过以下方式指定该文件

  • 问题内容: 我在Web应用程序中使用了JPA,但我想不出如何持久化彼此相关的两个新实体。这里是一个例子: 这是两个实体 该 消费者 有一个 ID 和其他一些价值观。该 ProfilePicture 使用 消费者 的 ID ,因为它是自己的主键和外键。(由于没有使用者,ProfilePicture将不存在,并且并非每个使用者都具有ProfilePicture) 我使用NetBeans生成实体类和会话

  • 问题内容: 这是一些简单的代码,但我只是不知道为什么我不能使用这个词作为表的实体 我意识到如果我使用key,我将无法使用“ key”,mysql将要求我检查语法,但是如果我使用“ id”或任何其他表,将会创建该表。 有人知道如何将实体名称创建为密钥吗?这并不重要,因为我只能使用id而不是key,但是由于我发现了此错误,所以我不知道是否有办法使它起作用。 问题答案: 您仍然可以使用。只要用反引号包起

  • 问题内容: 有没有一种方法可以将Point列映射到Java实体字段? 我尝试了Hibernate Spatial 4.0,但似乎没有PostGIS的纯PostgreSQL就无法使用。这是点字段定义: persistence.xml中的方言: 当我尝试保留该实体时,会引发异常: 似乎它试图将值保留为PostGIS的Geometry类型。但是我只想使用简单的Point。 问题答案: 您应该尝试在数据库

  • 有没有办法将点列映射到Java实体字段? 我尝试了Hibernate空间4.0,但似乎它不适用于没有PostGIS的纯PostgreSQL。这里是点字段定义: persistence.xml方言: 当我尝试持久化这个实体时,会引发异常: 因此,它似乎试图将价值作为PostGIS的几何类型。但是我想用简单的Point。