【问题标题】:MySql Json object deserialisation optimizationMySql Json 对象反序列化优化
【发布时间】:2017-03-08 08:46:38
【问题描述】:

我在 mysql 中有一个“文本”类型的字段,并在其中存储 json 数据。 例如:- "["android_app","iphone_app","windows_app"]";

我正在使用 hibernate 与 mysql 交互,并在读取此字段时将其反序列化为 Java 中的数组列表。

我的问题是,这是处理此类案件的最佳和最快的方法,还是有一些更好的方法。

【问题讨论】:

标签: java mysql hibernate


【解决方案1】:

如果您能够利用某些 JPA 2.1 功能,您可以使用AttributeConverter 自动为您处理此问题,而无需在您的业务代码中处理此问题。

public class YourEntity {
  // other stuff
  @Convert(converter = StringArrayToJsonConverter.class)
  List<String> textValues;
}

那么你只需定义转换器如下:

public class StringArraytoJsonConverter 
  implements AttributeConverter<List<String>, String> {

  @Override
  public string convertToDatabaseColumn(List<String> list) {
    // convert the list to a json string here and return it
  }

  @Override
  public List<String> convertToEntityAttribute(String dbValue) {
    // convert the json string to the array list here and return it
  }
}

最好的部分是它变成了一个可重用的组件,您可以简单地将其放置在您需要在 java 类中将 json 数组表示为 List&lt;&gt; 的任何位置,但宁愿使用单个文本字段将其作为 JSON 存储在数据库中。

另一种选择是避免将数据存储为 JSON,而是使用一个真实的表,它允许您实际查询 JSON 值。为此,您将使用 JPA 的 @ElementCollection 重写该映射

@ElementCollection
private List<String> textValues;

在内部,Hibernate 创建了一个辅助表,它在其中存储数组的文本字符串值,并引用拥有实体的主键,其中实体主键和字符串值被视为此辅助表的 PK。

然后,您可以在控制器/业务代码中将 List&lt;&gt; 序列化为 JSON 数组,以避免将持久性与该类型的介质混合,特别是考虑到大多数数据库尚未引入真正的 JSON 数据类型:)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 2016-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多