我在mysql中有一个类型为“text”的字段,并在其中存储json数据。 例如: - “[”android_app“,”iphone_app“,”windows_app“]”;
我正在使用hibernate与mysql进行交互,在阅读这个字段时,我将它反序列化为Java中的arraylist。
我的问题是,这是处理此类案件的最佳和最快的方式,还是有更好的方法。
答案 0 :(得分:0)
如果您能够利用某些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类中作为List<>
表示json数组,而宁愿将其作为JSON存储在数据库中使用单个文本字段。
另一种替代方法是避免将数据存储为JSON,而是使用真实表,它允许您实际查询JSON值。为此,您需要使用JPA的@ElementCollection
@ElementCollection
private List<String> textValues;
在内部,Hibernate创建一个辅助表,它存储数组的文本字符串值,并引用拥有实体的主键,其中实体主键和字符串值被视为此辅助表的PK。
然后,您可以处理序列化List<>
作为控制器/业务代码中的JSON数组,以避免将持久性与该类型的介质混合,特别是考虑到大多数数据库尚未引入真正的JSON
数据类型:)。