Saltar al contenido

¿Cómo almacenar PostgreSQL jsonb usando SpringBoot + JPA?

Te recomendamos que revises esta respuesta en un ambiente controlado antes de enviarlo a producción, un saludo.

Solución:

Intenté esto pero no entendí nada!

Para trabajar completamente con jsonb en JPA de datos de primavera (Hibernate) con la biblioteca de tipos de hibernación de Vlad Mihalcea, solo debe hacer lo siguiente:

1) Agregue esta biblioteca a su proyecto:


    com.vladmihalcea
    hibernate-types-52
    2.2.2

2) Luego use sus tipos en sus entidades, por ejemplo:

@Data
@NoArgsConstructor
@Entity
@Table(name = "parents")
@TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
public class Parent implements Serializable 

    @Id
    @GeneratedValue(strategy = SEQUENCE)
    private Integer id;

    @Column(length = 32, nullable = false)
    private String name;

    @Type(type = "jsonb")
    @Column(columnDefinition = "jsonb")
    private List children;

    @Type(type = "jsonb")
    @Column(columnDefinition = "jsonb")
    private Bio bio;

    public Parent(String name, List children, Bio bio) 
        this.name = name;
        this.children = children;
        this.bio = bio;
    


@Data
@NoArgsConstructor
@AllArgsConstructor
public class Child implements Serializable 
    private String name;


@Data
@NoArgsConstructor
@AllArgsConstructor
public class Bio implements Serializable 
    private String text;

Entonces podrá utilizar, por ejemplo, un simple JpaRepository para trabajar con tus objetos:

public interface ParentRepo extends JpaRepository 

parentRepo.save(new Parent(
                     "parent1", 
                     asList(new Child("child1"), new Child("child2")), 
                     new Bio("bio1")
                )
);
Parent result = parentRepo.findById(1);
List children = result.getChildren();
Bio bio = result.getBio();

Está haciendo las cosas demasiado complejas al agregar Spring Data JPA solo para ejecutar una declaración de inserción simple. No está utilizando ninguna de las funciones de JPA. En su lugar, haga lo siguiente

  1. Reemplazar spring-boot-starter-data-jpa con spring-boot-starter-jdbc
  2. Retira tu DnitRepository interfaz
  3. Inyectar JdbcTemplate donde estabas inyectando DnitRepository
  4. Reemplazar dnitRepository.insertdata(2, someJsonDataAsString ); con jdbcTemplate.executeUpdate("insert into dnit(id, data) VALUES (?,to_json(?))", id, data);

Ya estaba usando SQL simple (de una manera muy complicada), si necesita SQL simple (y no necesita JPA), simplemente use SQL.

Por supuesto, en lugar de inyectar directamente el JdbcTemplate en su controlador, probablemente desee ocultar esa lógica/complejidad en un repositorio o servicio.

valoraciones y comentarios

Recuerda dar difusión a este post si si solucionó tu problema.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *