2010-07-15 34 views
1

我想在Hibernate中使用UUID。如何使用UUID作爲Hibernate實體的主鍵?

有以下@Entity基類描述(@MappedSuperclass註釋):

@Id 
@Column(name="id") 
private UUID id; 

public UUID getId() 
{ 
    return id; 
} 

對於測試中,我試圖讀取數據庫我班上的所有實體(數據庫存在,記錄存在)。我的數據庫是支持UUID的PostgreSQL 8.4,主鍵是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。

回答

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; 
} 
相關問題