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
- Reemplazar
spring-boot-starter-data-jpa
conspring-boot-starter-jdbc
- Retira tu
DnitRepository
interfaz - Inyectar
JdbcTemplate
donde estabas inyectandoDnitRepository
- Reemplazar
dnitRepository.insertdata(2, someJsonDataAsString );
conjdbcTemplate.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.