Postgres + Hibernate + Java UUID

时间:2009-04-17 14:36:14

标签: java hibernate postgresql java-ee uuid

我想将PostgreSQL的本机UUID类型与Java UUID一起使用。我使用Hibernate作为我的JPA提供程序和ORM。如果我尝试直接保存它,它只是在Postgres中保存为bytea。

我该怎么做?

6 个答案:

答案 0 :(得分:9)

尝试使用JDBC驱动程序的最新开发版本(目前为8.4dev-700),或等待下一个发行版本。 (已编辑添加:8.4-701已发布)

release notes提到了这一变化:

  

将数据库uuid类型映射到java.util.UUID。这仅适用于相对较新的服务器(8.3)和JDK(1.5)版本。

答案 1 :(得分:4)

这是我在Postgresql UUID supported by Hibernate?上的答案的重新发布...我知道这个问题已经过时了,但是如果有人偶然发现它,这将有助于他们解决问题。

这可以通过在UUID中添加以下注释来解决:

import org.hibernate.annotations.Type;
...
@Type(type="pg-uuid")
private java.util.UUID itemUuid;

至于为什么Hibernate不会将其设为默认设置,我无法告诉你......

更新:使用createNativeQuery方法打开具有UUID字段的对象时似乎仍然存在问题。幸运的是,到目前为止createQuery方法对我来说效果很好。

答案 2 :(得分:0)

在非JPA用法中,我创建一个UserType来将UUID格式化为PostgreSQL接受的字符串,然后只需将UserType实现的名称作为列类型。

答案 3 :(得分:0)

你可以试试:

 @Column(name="foo", columnDefinition="uuid") 

其中columnDefinition是本机SQL的片段

答案 4 :(得分:0)

也许你可以将UUID类型自动转换为String(uuid.toString()应该给出规范的36-char表示)? DB通常在字符串和本机类型之间可靠地转换内容。

答案 5 :(得分:0)

试试这个

@Column(name = "UUID", nullable=false, insertable = false, columnDefinition="uuid DEFAULT uuid_generate_v4()")
private String uuid;