Postgres + Hibernate + Java Uuid
-
09-09-2019 - |
Pergunta
Eu quero usar o tipo UUID nativo do PostgreSQL com um java uuid. Estou usando o Hibernate como meu provedor JPA e ORM. Se eu tentar salvá -lo diretamente, ele será salvo como um bytea no Postgres.
Como posso fazer isso?
Solução
Tente usar a versão de desenvolvimento mais recente do driver JDBC (atualmente 8.4DEV-700) ou aguarde a próxima versão de lançamento. (Editado para adicionar: 8.4-701 foi lançado)
o Notas de liberação mencione esta mudança:
Mapeie o tipo de banco de dados uuid para java.util.uuid. Isso funciona apenas para versões de servidor relativamente novo (8.3) e JDK (1.5).
Outras dicas
Aqui está um repost da minha resposta em PostGresql UUID suportado por Hibernate? ... Eu sei que essa pergunta é antiga, mas se alguém tropeça nela, isso os ajudará.
Isso pode ser resolvido adicionando a seguinte anotação ao UUID:
import org.hibernate.annotations.Type;
...
@Type(type="pg-uuid")
private java.util.UUID itemUuid;
Quanto ao motivo pelo qual o Hibernate não apenas faz disso a configuração padrão, eu não poderia lhe dizer ...
ATUALIZAR: Ainda parece haver problemas usando o createNativeQuery
Método para abrir objetos que possuem campos UUID. Felizmente, o createQuery
O método até agora funcionou bem para mim.
No uso que não é JPA, eu criaria um userType para formatar o UUID como uma string que o PostGresql aceita e, em seguida, basta dar o nome da implementação do userType como o tipo de coluna.
você poderia tentar com:
@Column(name="foo", columnDefinition="uuid")
onde a columndefinition é um fragmento de sql nativo
Talvez você possa fazer com que o tipo UUID seja convertido automaticamente em uma string (uuid.toString () deve dar à representação canônica de 36-char)? O DBS geralmente converte as coisas de maneira confiável entre cordas e tipos nativos.
Tente isso
@Column(name = "UUID", nullable=false, insertable = false, columnDefinition="uuid DEFAULT uuid_generate_v4()")
private String uuid;