如何使用UUID作为Hibernate实体的主键?

我试图在Hibernate中使用UUID。

具有以下@Entity基类描述(使用@MappedSuperclass注释):

  @Id @Column(name="id") private UUID id; public UUID getId() { return id; } 

为了测试,我试图从数据库中读取我的类的所有实体(数据库存在,记录存在)。 我的数据库是PostgreSQL 8.4,支持UUID,主键是UUID类型。

运行我的测试我在日志中得到以下内容:

 [junit] 14:21:34,839 INFO LongType:203 - could not read column value from result set: id0_0_; Bad value for type long : d46668b8-e494-42ba-803f-c43524ac3f31 

 [junit] org.postgresql.util.PSQLException: Bad value for type long : d46668b8-e494-42ba-803f-c43524ac3f31 [junit] at org.postgresql.jdbc2.AbstractJdbc2ResultSet.toLong(AbstractJdbc2ResultSet.java:2796) [junit] at org.postgresql.jdbc2.AbstractJdbc2ResultSet.getLong(AbstractJdbc2ResultSet.java:2019) [junit] at org.postgresql.jdbc2.AbstractJdbc2ResultSet.getLong(AbstractJdbc2ResultSet.java:2431) [junit] at org.apache.commons.dbcp.DelegatingResultSet.getLong(DelegatingResultSet.java:240) [junit] at org.hibernate.type.LongType.get(LongType.java:51) [junit] at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:184) [junit] at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:173) [junit] at org.hibernate.loader.Loader.getKeyFromResultSet(Loader.java:1121) 

看起来Hibernate并没有真正使用它可能从我的实体注释描述解析的UUID类型。 与Spring而不是UUID相同的情况。

我怎么能告诉Hibernate我想用UUID或String而不是Long来获取主键?

PS:Hibernate我使用3.3.2.GA. 我不使用EntityManager 。 我用注释描述映射并用Spring配置Hibernate。

我将密钥称为字符串:

 private UUID id; @Id @Column(name="id") public String getId() { return id.toString(); } public void setId(String value) { id = UUID.fromString(value); } public UUID idAsUUID() { return id; }