"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como mapear colunas JSON do PostgreSQL para entidades de hibernação usando um tipo de usuário personalizado?

Como mapear colunas JSON do PostgreSQL para entidades de hibernação usando um tipo de usuário personalizado?

Publicado em 2024-11-08
Navegar:412

How to Map PostgreSQL JSON Columns to Hibernate Entities Using a Custom User Type?

Mapeando colunas JSON do PostgreSQL para entidades do Hibernate

Ao trabalhar com bancos de dados PostgreSQL, é comum encontrar colunas que armazenam dados no formato JSON. Para mapear efetivamente essas colunas para entidades Java usando o Hibernate, é essencial escolher o tipo de dados apropriado.

Neste contexto, a questão em questão gira em torno do mapeamento de uma coluna JSON do PostgreSQL para um campo de entidade do Hibernate. Uma abordagem comum é usar um campo String, como visto no trecho de código fornecido:

@Entity
public class MyEntity {

    private String jsonPayload;

    public MyEntity() {
    }
}

No entanto, essa abordagem pode levar a exceções ao salvar a entidade, pois o Hibernate tenta converter uma String em JSON.

Tipo de valor correto para colunas JSON

Para mapear corretamente uma coluna JSON do PostgreSQL para um campo de entidade do Hibernate, considere usar um tipo de usuário personalizado. Ao criar uma implementação userType, como StringJsonUserType, você pode lidar com o mapeamento entre valores String e o tipo de banco de dados JSON.

Aqui está um exemplo de implementação:

public class StringJsonUserType implements UserType {
    ...
    @Override
    public int[] sqlTypes() {
        return new int[] { Types.JAVA_OBJECT};
    }

    ...
}

Você pode então anotar a propriedade da entidade com o userType personalizado:

@Type(type = "StringJsonObject")
public String getJsonPayload() {
    return jsonPayload;
}

Configuração adicional

Para implementar totalmente esta solução, pode ser necessário:

  1. Estender o dialeto PostgreSQL para incluir o tipo JSON :
public class JsonPostgreSQLDialect extends PostgreSQL9Dialect {
    ...
    this.registerColumnType(Types.JAVA_OBJECT, "json");
    ...
}
  1. Anote a classe de entidade com @TypeDefs:
@TypeDefs({ @TypeDef( name= "StringJsonObject", typeClass = StringJsonUserType.class)})
  1. Injete as bibliotecas necessárias na implementação do tipo de usuário para mapeamento avançado.

Projeto de referência do GitHub

Para uma exploração mais aprofundada, considere o projeto GitHub fornecido: https://github.com/timfulmer/hibernate-postgres-jsontype

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3