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

发布于 2021-02-02 16:22:43

我们有一张有很多列的大桌子。移至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字符串?

关注者
0
被浏览
99
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    您可以使用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。



推荐阅读
知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看