Te recomendamos que revises esta resolución en un entorno controlado antes de pasarlo a producción, un saludo.
Solución:
Cambia tu clase de modelo como esta
@Entity
@Table(name="some_table")
public class SomeModel
@Id
@Column(name="p_col", nullable=false)
private Integer id;
@Column(name="s_col")
private String name
@Column(name="t_col")
private String json; // this column contains json data
@Column(name = "t_col", columnDefinition = "json")
@Convert(attributeName = "data", converter = JsonConverter.class)
private Map json = new HashMap<>();
//constructors
//getters and setters
Escriba una clase de convertidor json.
@Converter
public class JsonConverter
implements AttributeConverter>
@Override
public Map convertToDatabaseColumn(String attribute)
if (attribute == null)
return new HashMap<>();
try
ObjectMapper objectMapper = new ObjectMapper();
return objectMapper.readValue(attribute, HashMap.class);
catch (IOException e)
return new HashMap<>();
@Override
public String convertToEntityAttribute(Map dbData)
try
ObjectMapper objectMapper = new ObjectMapper();
return objectMapper.writeValueAsString(dbData);
catch (JsonProcessingException e)
return null;
Convertirá la base de datos json attribute a los resultados de su deseo. Gracias
Necesitas definir tu json attribute como JsonNode para que jackson pueda leerlo hacia adelante y hacia atrás, pero la marca es como @Transient
entonces JPA no intenta almacenarlo en la base de datos.
Luego puede codificar getter/setter para JPA, donde traduce de JsonNode a String hacia adelante y hacia atrás. Usted define un getter getJsonString
que traducen JsonNode json
a String
. Ese se puede asignar a una columna de tabla, como ‘json_string’, luego define un setter donde recibe el String
de JPA y analizarlo en JsonNode que estará disponible para jackson, jackson luego lo traducirá a un objeto json, no a un string como mencionas.
@Entity
@Table(name = "model")
public class SomeModel
private Long id;
private String col1;
// Attribute for Jackson
@Transient
private JsonNode json;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Long getId()
return id;
@Column(name ="col1")
public String getCol1()
return col1;
// Getter and setter for name
@Transient
public JsonNode getJson()
return json;
public void setJson(JsonNode json)
this.json = json;
// Getter and Setter for JPA use
@Column(name ="jsonString")
public String getJsonString()
return this.json.toString();
public void setJsonString(String jsonString)
// parse from String to JsonNode object
ObjectMapper mapper = new ObjectMapper();
try
this.json = mapper.readTree(jsonString);
catch (Exception e)
e.printStackTrace();
Aviso, @Column
se definen en gettters porque necesitamos indicar JPA para usar getJsonString
y JPA requiere consistencia, por lo que todos los captadores de columna deben marcarse con @Columns
.
Aquí tienes las reseñas y calificaciones
Tienes la opción de añadir valor a nuestro contenido tributando tu veteranía en las notas.