我正在开发一个使用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之后,我看到这个片段似乎可能是相关的:
从上述链接中引用
默认的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