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方法对我来说很好.
小智 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/
您尝试持久化UUID类型的对象,这不是带有hibernate注释的实体.所以hibernate想要将它序列化为字节数组(blob类型).这就是为什么你得到这个消息'类型为bytea'的表达式.
您可以将UUID存储为数据库中的blob(非优雅),也可以提供自定义序列化程序(大量工作)或手动转换该对象.UUID类有fromString和toString的方法,所以我将它存储为String.
归档时间: |
|
查看次数: |
18101 次 |
最近记录: |