Hibernate支持Postgresql UUID?

for*_*ker 14 java postgresql orm hibernate hibernate-mapping

我不能让Hibernate使用java.util.UUID for PostgreSQL.

这是使用javax.persistence的映射.*annotations:

private UUID itemUuid;

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

public void setItemUuid(UUID itemUuid) {
    this.itemUuid = itemUuid;
}
Run Code Online (Sandbox Code Playgroud)

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

column "item_uuid" is of type uuid but expression is of type bytea at character 149
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

Rob*_*n P 32

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

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

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

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

  • 在最新版本的hibernate(5.2.12)中无法识别`@Type(type ="pg-uuid")`.相反,我使用`@Type(type ="org.hibernate.type.PostgresUUIDType")`来解决问题. (5认同)
  • (续)如果您希望它在不指定查询类型信息的情况下工作,请创建一个自定义Dialect(扩展您现在使用的Postgres),在其构造函数中执行以下调用:`registerHibernateType(Types.OTHER,"pg-uuid ");` (4认同)
  • 失败到'H2`数据库.`引起:org.hibernate.MappingException:没有JDBC类型的Dialect映射:1111` (3认同)

小智 6

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

  @Id
  @GeneratedValue
  private UUID id;
Run Code Online (Sandbox Code Playgroud)

默认情况下生成的值是 auto 这让您的 JVM 定义 UUID。这也允许休眠使用批量插入优化。

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


Dan*_*lor 5

您尝试持久化UUID类型的对象,这不是带有hibernate注释的实体.所以hibernate想要将它序列化为字节数组(blob类型).这就是为什么你得到这个消息'类型为bytea'的表达式.

您可以将UUID存储为数据库中的blob(非优雅),也可以提供自定义序列化程序(大量工作)或手动转换该对象.UUID类有fromString和toString的方法,所以我将它存储为String.

  • 谢谢你的回答,lech,但根据 http://opensource.atlassian.com/projects/hibernate/browse/HHH-3579 Hibernate 应该像使用任何其他类型一样使用 UUID 类型......并且在 char 类型中有 uuids 是从性能的角度来看是有害的。还有一个教程项目 http://opensource.atlassian.com/projects/hibernate/browse/HHH-4093 显示了在没有冗余解决方法的情况下使用 UUID。 (2认同)