Hibernate 支持的 Postgresql UUID?

我无法让Hibernate使用Java.util.UUID为PostgreSQL工作。

以下是使用javax.persistence.*注释的映射:

private UUID itemUuid;

@Column(name="item_uuid",columnDefinition="uuid NOT NULL")
public UUID getItemUuid() {
    return itemUuid;
}

public void setItemUuid(UUID itemUuid) {
    this.itemUuid = itemUuid;
}

当持久化一个瞬态对象时,我得到一个SQLGrammarException:

column "item_uuid" is of type uuid but expression is of type bytea at character 149

PostgreSQL版本是8.4.4
JDBC驱动程序 - 8.4.4-702(也尝试过9.0 - 同样的事情)
Hibernate版本是3.6,主要配置属性:

<property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
<property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
<property name="hibernate.connection.url">jdbc:postgresql://192.168.1.1/db_test</property>

答案 1

这可以通过向 UUID 添加以下注释来解决:

import org.hibernate.annotations.Type;
...
@Type(type="pg-uuid")
private java.util.UUID itemUuid;

至于为什么Hibernate不只是将其设置为默认设置,我无法告诉您...

更新:使用 createNativeQuery 方法打开具有 UUID 字段的对象似乎仍然存在问题。幸运的是,到目前为止,createQuery方法对我来说效果很好。


答案 2

现在,您还可以使用 java.util.UUID 提供的 UUID 类,该类通过 Hibernate 映射到 Postgres 的 uuid 数据类型,而无需在从数据库读取/写入时进行任何转换。

  @Id
  @GeneratedValue
  private UUID id;

默认情况下,生成的值是自动的,这允许您的 JVM 定义 UUID。这也允许休眠使用批处理插入优化。

您可以配置数据库以设置 UUID 值。更多信息可以在这里找到 https://vladmihalcea.com/uuid-identifier-jpa-hibernate/


推荐