Как использовать UUID в качестве первичного ключа для Hibernate Entity? - PullRequest
1 голос
/ 15 июля 2010

Я пытаюсь использовать UUID в Hibernate.

Имею следующее @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.Я описываю сопоставление с аннотациями и настраиваю Hibernate с помощью Spring.

1 Ответ

3 голосов
/ 15 июля 2010

Я бы обозначил ключ как String:

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