Hibernate 5打破了Postgresql中Java UUID的遗留处理

Hibernate 5打破了Postgresql中Java UUID的遗留处理,hibernate,Hibernate,升级我们的一个框架库导致我们的Hibernate版本从4升级到5。在这样做的过程中,现在我们对PostgreSQL数据库的查询失败,出现以下异常 原因:org.postgresql.util.PSQLException:错误:运算符不存在 exist:bytea=uuid提示:没有与给定名称和 参数类型。您可能需要添加显式类型转换。 职位:1827 问题似乎是从bytea转换为javauuid。我们所有的记录id都是JavaUUID,它被写入数据库,就像Hibernate4中的规范一样。下面是用

升级我们的一个框架库导致我们的Hibernate版本从4升级到5。在这样做的过程中,现在我们对PostgreSQL数据库的查询失败,出现以下异常

原因:org.postgresql.util.PSQLException:错误:运算符不存在 exist:bytea=uuid提示:没有与给定名称和 参数类型。您可能需要添加显式类型转换。
职位:1827

问题似乎是从bytea转换为javauuid。我们所有的记录id都是JavaUUID,它被写入数据库,就像Hibernate4中的规范一样。下面是用于定义id字段的JPA注释。我们在Hibernate4中对此没有任何问题,我怀疑我需要更改注释以使其在Hibernate5中再次工作

@Id
@GeneratedValue(generator = "uuid2")
@GenericGenerator(name = "uuid2", strategy = "uuid2")
private UUID id;
我注意到添加到org.hibernate.type.postgresuidtype的更改是添加了以下方法:

@Override
protected boolean registerUnderJavaType() {
    // register this type under UUID when it is added to the basic type registry
    return true;
}
我假定Java UUID的处理默认为PostgreSQL的本机UUID类型。此更改是在Hibernate 5()中专门进行的

我的问题是如何恢复Hibernate 4的行为,因为我们已经有了一个现有的数据库模式

多谢各位

更新

我在这里找到了迁移指南:

它声明如下:

对于定义为UUID并生成的ID,对于某些数据库是 需要显式设置@Column(长度=16),以便 生成二进制(16),以便比较正常工作


我试过了,但行为仍然没有改变。

我相信我找到了解决办法。我现在需要用类型“UUID binary”标记我的UUID类型。验证了这会生成他们在Postgres中键入的bytea,并且我可以从现有数据库中读取记录

@Id
@GeneratedValue(generator = "uuid2")
@GenericGenerator(name = "uuid2", strategy = "uuid2")
@Type(type = "uuid-binary")
private UUID id;

如果您像我一样有很多UUID属性,您可以在包级别(在
package info.java
文件中)使用
@TypeDef
注释,如下所示:

//强制将UUID属性映射为二进制列(用于向后兼容)
@TypeDef(defaultForType=UUID.class,typeClass=UUIDBinaryType.class)
包裹
导入org.hibernate.annotations.TypeDef;
导入org.hibernate.type.UUIDBinaryType;
导入java.util.UUID;

这不是最干净的解决方案,但它避免了更改每个UUID属性。

我添加了
@Column(columnDefinition=“BINARY(16)”)
,并将其替换为
@Column(length=16)
,这对我很有效。
// Forces UUID attributes to be mapped as binary columns (for backward-compatibility)
@TypeDef(defaultForType = UUID.class, typeClass = UUIDBinaryType.class)
package <your top-level package>;

import org.hibernate.annotations.TypeDef;
import org.hibernate.type.UUIDBinaryType;

import java.util.UUID;