Sobes.tech
Senior

Qual é a diferença entre JSON e JSONB no PostgreSQL? Problemas com Hibernate e campos JSON

sobes.tech IA

Resposta da IA

Em PostgreSQL, os tipos JSON e JSONB armazenam ambos dados em formato JSON, mas diferem na sua representação interna:

  • JSON: armazena os dados como texto, preservando o formato original, incluindo espaços e a ordem das chaves.
  • JSONB: formato binário, que é indexado e otimizado para buscas rápidas e operações com dados.

JSONB é geralmente preferido para consultas e indexação, embora ocupe um pouco mais de espaço ao gravar.

O problema com Hibernate e campos JSON é que o Hibernate não tem suporte embutido para os tipos JSON/JSONB do PostgreSQL. Para trabalhar com eles, muitas vezes usam-se tipos de usuário personalizados ou bibliotecas, como Hibernate Types, que permitem mapear campos JSON para objetos Kotlin/Java.

Exemplo de um UserType personalizado para JSONB:

@TypeDef(name = "jsonb", typeClass = JsonBinaryType::class)
@Entity
class MyEntity(
    @Type(type = "jsonb")
    @Column(columnDefinition = "jsonb")
    val data: Map<String, Any>
)

Sem esse suporte, o Hibernate pode salvar JSON como uma string, o que reduz a eficiência e a conveniência de uso.