我无法让Hibernate与PostgreSQL的java.util.UUID一起工作。
下面是使用javax.persistence.* annotations的Map:
private UUID itemUuid;
@Column(name="item_uuid",columnDefinition="uuid NOT NULL")
public UUID getItemUuid() {
return itemUuid;
}
public void setItemUuid(UUID itemUuid) {
this.itemUuid = itemUuid;
}
当持久化一个 transient 对象时,我得到一个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>
7条答案
按热度按时间xfb7svmp1#
这可以通过向UUID添加以下注解来解决:
至于为什么Hibernate不把它设为默认设置,我不能告诉你……
更新:使用createNativeQuery方法打开具有UUID字段的对象似乎仍然存在问题。幸运的是,createQuery方法到目前为止对我来说工作得很好。
pexxcrt22#
现在你也可以使用java.util.UUID提供的UUID类,它被HibernateMap到Postgres的uuid数据类型,而不需要在从数据库阅读/写入时进行任何转换。
默认情况下生成的值是auto,这允许JVM定义UUID。这也允许hibernate使用批量插入优化。
您可以配置数据库以设置UUID值。更多信息可在此处找到https://vladmihalcea.com/uuid-identifier-jpa-hibernate/
e5njpo683#
您尝试持久化UUID类型的对象,该对象不是带休眠注解的实体。所以hibernate希望将其序列化为字节数组(blob类型)。这就是为什么你得到这个消息'expression of type bytea'。
您可以将UUID存储为数据库中的blob(不优雅),或提供自定义序列化程序(需要大量工作)或手动转换该对象。UUID类有fromString和toString方法,所以我将其存储为String。
bprjcwpo4#
正如其他人提到的,这个问题的解决方案是添加一个
@Type(type = "pg-uuid")
注解。然而,这种类型与其他供应商的UUID类型不兼容,所以这将Hibernate类与Postgres绑定在一起。为了解决这个问题,可以在运行时插入这个注解。下面是Hibernate 4.3.7。首先,您需要插入一个自定义元数据提供程序来插入注解。创建
Configuration
类示例后的第一步就是这样做:此自定义元数据提供程序查找类型为
UUID
的字段和方法。如果它找到一个,它会插入org.hibernate.annotations.Type
注解的示例,声明类型应为"pg-uuid"
:r7xajy2e5#
不使用JPA的人的解决方案。
之前:
之后:
2w3kk1z56#
我在postgres中使用Sprint Data和jsonb时遇到了类似的问题。谢谢Sri的解决方案!
在模型中,替换
与
解决了使用@SpringBootTest运行JUnit测试的问题。
实体(Kotlin)中的示例:
dzhpxtsq7#
对于我使用的新hibernate