如何使用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; }