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?

Foi útil?

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;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top