使用带有Hibernate的postgres UUID主键时出错

时间:2016-12-14 18:12:02

标签: spring-boot uuid postgresql-9.4 hibernate-5.x

我正在开发一个使用Spring boot 1.4.1的greenfield web应用程序 - 它使用spring 4.3.3& Hibernate 5.2.3.Final引擎盖下。

我们正在使用Postgres 9.4作为我们的数据库,所以我的类路径中也有postgres-9.4.1212.jar。

我的所有表都使用UUID类型的主键(和外键)。 在我的实体类本身中,我对id属性有以下注释:

@Id
@Type(type = "pg-uuid")
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid2")
@Column(unique = true, nullable = false, columnDefinition = "uuid")
private UUID id;

当我们使用此网址连接到数据库并进行查询时

spring.datasource.url: jdbc:postgresql://localhost:5432/mydb

我们收到以下错误

Caused by: org.postgresql.util.PSQLException: 
    ERROR: operator does not exist: uuid = bytea
  Hint: No operator matches the given name and argument type(s). 
    You might need to add explicit type casts.
  Position: 139
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2458)

当我们将连接URL更改为以下内容时,错误消失并且查询正常工作:

spring.datasource.url: jdbc:postgresql://localhost:5432/mydb?stringtype=unspecified

请注意添加的后缀:?stringtype = unspecified

问题:

这是正确的做法吗? 有没有更好的方法来解决错误?

看到一些与在hibernate中使用postgres UUID相关的堆栈溢出帖子,所以看起来其他人也有同样的问题。答案似乎都不令人满意。奇怪的是,这不会开箱即用。

在仔细阅读Hibernate 5.2.3文档和R-ing TFM之后,我看到这个片段似乎可能是相关的:

docs

从上述链接中引用

  

默认的UUID映射是二进制,因为它代表更多   高效存储。然而,许多应用程序更喜欢可读性   字符存储。要切换默认映射,只需调用

即可      

MetadataBuilder.applyBasicType(UUIDCharType.INSTANCE,   UUID.class.getName())

另外,在上述文件的第2.3.13节中,它也说明了这个

  

使用PostgreSQL的特定UUID数据类型映射UUID。该   PostgreSQL JDBC驱动程序选择将其UUID类型映射到OTHER代码。   请注意,这可能会导致驾驶员选择映射很多困难   不同的数据类型为OTHER。

我怀疑我需要创建一个 @Bean 来告诉Spring-boot配置MetadataBuilder,但我不太清楚如何做到这一点。

寻找有关如何配置hibernate的MetadataBuilder以将UUID作为char而不是二进制处理的一些见解。

-sgb

0 个答案:

没有答案