gpt4 book ai didi

java - 如何使用 JPA 将映射 JSON 列映射到 Java 对象

转载 作者:IT老高 更新时间:2023-10-28 23:59:00 26 4
gpt4 key购买 nike

我们有一个包含很多列的大表。迁移到MySQL Cluster后,无法创建表,原因是:

ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 14000. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

举个例子:

@Entity @Table (name = "appconfigs", schema = "myproject")
public class AppConfig implements Serializable
{
@Id @Column (name = "id", nullable = false)
@GeneratedValue (strategy = GenerationType.IDENTITY)
private int id;

@OneToOne @JoinColumn (name = "app_id")
private App app;

@Column(name = "param_a")
private ParamA parama;

@Column(name = "param_b")
private ParamB paramb;
}

这是一个存储配置参数的表。我在想我们可以将一些列组合成一个并将其存储为 JSON 对象并将其转换为一些 Java 对象。

例如:

@Entity @Table (name = "appconfigs", schema = "myproject")
public class AppConfig implements Serializable
{
@Id @Column (name = "id", nullable = false)
@GeneratedValue (strategy = GenerationType.IDENTITY)
private int id;

@OneToOne @JoinColumn (name = "app_id")
private App app;

@Column(name = "params")
//How to specify that this should be mapped to JSON object?
private Params params;
}

我们定义的地方:

public class Params implements Serializable
{
private ParamA parama;
private ParamB paramb;
}

通过使用它,我们可以将所有列合并为一个并创建我们的表。或者我们可以将整个表拆分成几个表。我个人更喜欢第一种解决方案。

无论如何,我的问题是如何映射 Params 列,它是文本并且包含 Java 对象的 JSON 字符串?

最佳答案

您可以使用 JPA 转换器将您的实体映射到数据库。只需在您的 params 字段中添加与此类似的注释即可:

@Convert(converter = JpaConverterJson.class)

然后以类似的方式创建类(这会转换通用对象,您可能需要对其进行专门化):

@Converter(autoApply = true)
public class JpaConverterJson implements AttributeConverter<Object, String> {

private final static ObjectMapper objectMapper = new ObjectMapper();

@Override
public String convertToDatabaseColumn(Object meta) {
try {
return objectMapper.writeValueAsString(meta);
} catch (JsonProcessingException ex) {
return null;
// or throw an error
}
}

@Override
public Object convertToEntityAttribute(String dbData) {
try {
return objectMapper.readValue(dbData, Object.class);
} catch (IOException ex) {
// logger.error("Unexpected IOEx decoding json from database: " + dbData);
return null;
}
}

}

就是这样:你可以使用这个类将任何对象序列化为表中的json。

关于java - 如何使用 JPA 将映射 JSON 列映射到 Java 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25738569/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com