【发布时间】:2017-03-08 08:46:38
【问题描述】:
我在 mysql 中有一个“文本”类型的字段,并在其中存储 json 数据。 例如:- "["android_app","iphone_app","windows_app"]";
我正在使用 hibernate 与 mysql 交互,并在读取此字段时将其反序列化为 Java 中的数组列表。
我的问题是,这是处理此类案件的最佳和最快的方法,还是有一些更好的方法。
【问题讨论】:
我在 mysql 中有一个“文本”类型的字段,并在其中存储 json 数据。 例如:- "["android_app","iphone_app","windows_app"]";
我正在使用 hibernate 与 mysql 交互,并在读取此字段时将其反序列化为 Java 中的数组列表。
我的问题是,这是处理此类案件的最佳和最快的方法,还是有一些更好的方法。
【问题讨论】:
如果您能够利用某些 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<> 的任何位置,但宁愿使用单个文本字段将其作为 JSON 存储在数据库中。
另一种选择是避免将数据存储为 JSON,而是使用一个真实的表,它允许您实际查询 JSON 值。为此,您将使用 JPA 的 @ElementCollection 重写该映射
@ElementCollection
private List<String> textValues;
在内部,Hibernate 创建了一个辅助表,它在其中存储数组的文本字符串值,并引用拥有实体的主键,其中实体主键和字符串值被视为此辅助表的 PK。
然后,您可以在控制器/业务代码中将 List<> 序列化为 JSON 数组,以避免将持久性与该类型的介质混合,特别是考虑到大多数数据库尚未引入真正的 JSON 数据类型:)。
【讨论】: