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

时间:2010-07-15 10:33:04

标签: java hibernate postgresql uuid

我正在尝试在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。

1 个答案:

答案 0 :(得分:3)

我将密钥称为字符串:

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;
}