Estoy intentando persistir una entidad en PostgreSQL que usa UUID como clave principal. He intentado que persiste como un UUID claro:UUID persistente en PostgreSQL usando JPA
@Id
@Column(name = "customer_id")
private UUID id;
Con lo anterior, me sale este error:
ERROR: column "customer_id" is of type uuid but expression is of type bytea
Hint: You will need to rewrite or cast the expression.
Position: 137
También probé persistiendo el UUID como byte [] en vano:
@Transient
private UUID id;
@Id
@Column(name = "customer_id")
@Access(AccessType.PROPERTY)
@Lob
protected byte[] getRowId() {
return id.toString().getBytes();
}
protected void setRowId(byte[] rowId) {
id = UUID.fromString(new String(rowId));
}
Si elimino @Lob, el error que obtengo es el mismo que el publicado anteriormente. Pero con @Lob aplicada, el error cambia ligeramente a:
ERROR: column "customer_id" is of type uuid but expression is of type bigint
Hint: You will need to rewrite or cast the expression.
Position: 137
me siento muy mal al no poder hacer algo tan simple como esto!
Estoy usando Hibernate 4.1.3.Final con PostgreSQL 9.1.
He visto numerosas preguntas sobre SO más o menos con el mismo problema, pero todas son viejas y ninguna parece tener una respuesta directa.
Me gustaría lograr esto de forma estándar sin recurrir a hacks feos. Pero si esto solo se puede lograr mediante (feos) hacks, entonces puede ser que sea eso lo que haré. Sin embargo, no quiero almacenar el UUID como varchar en la base de datos ya que no es bueno para el rendimiento. Además, me gustaría no introducir una dependencia de Hibernate en mi código si es posible.
Cualquier ayuda sería muy apreciada.
ACTUALIZA 1 (2012-07-03 24:15)
Bueno, bueno, bueno ... Es un poco interesante que he probado el mismo código (UUID llano, sin conversión - el primera versión del código publicado anteriormente) con SQL Server 2008 R2 usando el controlador JTDS (v1.2.5) y, adivina qué, funcionó como un encanto (por supuesto, tuve que cambiar la información relacionada con la conexión en persistence.xml).
Ahora, ¿es un problema específico de PostgreSQL o qué?
posible duplicado de [Postgresql UUID compatible con Hibernate?] (Http://stackoverflow.com/questions/4495233/postgresql-uuid-supported-by -hibernate) –
Como mencioné en mi publicación, hay muchas preguntas sobre SO con el mismo problema, pero todas son antiguas y ninguna parece tener una solución buena y funcional. La publicación que mencionaste no es una excepción (que, por cierto, vi antes de publicar mi pregunta). – ehsanullahjan