当前位置: 首页 > 面试题库 >

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

龙高超
2023-03-14
问题内容

我们有一张有很多列的大桌子。移至MySQL Cluster后,由于以下原因无法创建表:

错误1118(42000):行大小太大。不包括BLOB在内的已使用表类型的最大行大小为14000。这包括存储开销,请查阅手册。您必须将某些列更改为TEXT或BLOB

举个例子:

@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。



 类似资料:
  • 我们有一张有很多柱子的大桌子。在我们移动到MySQL集群后,表无法创建,因为: 错误1118 (42000):行大小过大。使用的表类型(不包括BLOB)的最大行大小为14000。这包括存储开销,检查手册。您必须将一些列更改为TEXT或BLOB 例如: 它是一个用于存储配置参数的表。我在想,我们可以将一些列组合成一个列,并将其存储为JSON对象,并将其转换为Java对象。 例如: 我们定义了: 通过

  • 问题内容: 我在了解如何实现这一目标方面遇到了问题。 基本上我们有一个API,用户发送以下格式的JSON :(如果代码不完美,请原谅,但您可以理解) 好的,我不确定我是否正确设置了JSON格式,但是现在这是我的问题。 我有一个带有参数Name,Last的类,还有一个作为其成员之一的对象Client和Property Date。 像这样: 因此,基本上,我不确定如何获取JSON,然后将其映射到我的对

  • 我编写了货币转换器程序,从,映射对象并创建选定速率的简单数据集。我的程序运行得很好,直到我停止使用解析和映射对象,并用替换它。它可以很好地读取基础货币和日期,但不能读取<代码>汇率 子对象。为什么? 我的代码:类别: 类: 必须使用映射对象的类: 我试图解析和映射的示例JSON数据 我正在使用这个对象来准备对象,该对象具有一个简单的

  • 问题内容: 我正在尝试将JSON文件映射到类对象,然后根据新接收的JSON更新卡。 我的JSON结构是这样的 我的班级看起来像这样: 如何将JSON文件中的值映射到CardInfo类创建的对象的字段中? 更新资料 以下试用版在 ci.description上 打印为null ,是否表示从未创建该对象? 更新2 打印cardInfo给出以下内容: {$ class:FirstCard,id:1,说明

  • 假设我有这样的物体 我正在使用RestTemboard类从URL中获取json,如下所示: 之后,我想使用jackson对象映射器将json字符串转换为一个对象 将实体类作为第二个参数传递 问题是我应该如何编写ExampleJson实体来处理get-Showed json?我试过这样上课,但似乎不管用。 我得到了这样一个例外:

  • 问题内容: 我一直在尝试使用PC上的JSON文件将JSON数据映射到Java对象,但是它总是抛出异常: 我的数据类: 我的映射器类: json文件包含以下数据: 我究竟做错了什么?我正在使用Jackson图书馆。 问题答案: 这是我在您的代码中看到的问题列表: 该属性应放在类之上,而不是类之上。查阅文档,最值得注意的是有关“ ignoreUnknown”属性的说法,默认为false: 公共抽象布尔