如何使用 JPA 和 Hibernate 自动序列化和反序列化 JSON 字符串?

2024-04-16

我有数据类/表“用户”,其中有“首选项”列

CREATE table "user"; 
ALTER TABLE "user" ADD COLUMN preferences TEXT;

首选项类型是 TEXT,我在那里存储 JSON。

public class User extends AbstractEntity{
public String preferences;
}

so user.preferences值为"{notifyByEmail:1, favouriteColor:"blue" }"

我怎样才能用一些注释来包装它,这样我就可以像这样访问它

user.preferences.notifyByEmail

或者不需要包装到数据对象中

user.preferences.get("notifByEmail");
user.preferences.set("notifByEmail",true);

我想我可以将一些杰克逊注释添加到字段中 喜欢

@JsonGenerate
public String preferences;

我对 JPA 相当陌生,文档也很丰富。

我相信我的情况很常见。谁能举一些例子吗?


可以使用 JPA Converter 来实现这一点。

Entity;

@Id
@GeneratedValue
Long id;

@Column(name = "mapvalue")
@Convert(converter = MapToStringConverter.class)
Map<String, String> mapValue;

转换器:

@Converter
public class MapToStringConverter implements AttributeConverter<Map<String, String>, String> {

    ObjectMapper mapper = new ObjectMapper();

    @Override
    public String convertToDatabaseColumn(Map<String, String> data) {
        String value = "";
        try {
            value = mapper.writeValueAsString(data);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return value;
    }

    @Override
    public Map<String, String> convertToEntityAttribute(String data) {
        Map<String, String> mapValue = new HashMap<String, String>();
        TypeReference<HashMap<String, Object>> typeRef = new TypeReference<HashMap<String, Object>>() {
        };
        try {
            mapValue = mapper.readValue(data, typeRef);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return mapValue;
    }

}

保存数据:

Map<String, String> mapValue = new HashMap<String, String>();
mapValue.put("1", "one");
mapValue.put("2", "two");
DataEntity entity = new DataEntity();
entity.setMapValue(mapValue);
repo.save(entity);

该值将存储在数据库中

{"1":"three","2":"two"}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 JPA 和 Hibernate 自动序列化和反序列化 JSON 字符串? 的相关文章

随机推荐

  • Go:使用 gdb 打印变量

    在此程序中 如何使用调试器中断执行并打印 i 的值 package main import fmt func main x abc i 3 fmt Println i fmt Println x 我无法打印我 不过我可以打印 x go bu
  • 将工具栏设置为片段中的操作栏

    我想将我的工具栏设置为操作栏 但由于您的工具栏是布局元素 因此它必须位于您的布局中 现在我的布局在我的片段中 我在布局中添加了工具栏 并在片段中调用它 Toolbar Toolbar toolbar Toolbar getActivity
  • 如何有条件地要求 Angular 4 中的表单输入?

    我正在使用模板驱动的表单来添加任务 并且有 2 个数字类型的输入字段用于估计完成任务的分钟数 一个字段用于估计小时数和 另一个是完成任务的估计分钟数 因为任务估计可以在几小时内完成 例如1hrs 或者像这样的小时和分钟1小时30分钟 所以我
  • PHP7 - nusoap - nusoap_client 有一个已弃用的构造函数

    我想用nusoap on Laravel 5 3 with PHP7 但是当我生病时尝试安装它composer从该包中 https github com codecasts nusoap php7 https github com code
  • unique_together 中的多个元组

    当我定义模型并在元中使用 unique together 时 我可以定义多个元组 这些是进行 OR 运算还是 AND 运算 可以说我有一个模型 class MyModel models Model druggie ForeignKey dr
  • 给定一个字符串数组,返回所有属于字谜词组的字符串

    给定一个字符串数组 返回所有属于字谜词的字符串组 我的解决方案 对于数组中的每个字符串单词 对其进行排序 O m lg m m 是单词的平均长度 建立一个哈希表 将排序后的单词作为键放入哈希表中 并生成该单词的所有排列 O m 如果字典中存
  • 用于验证 Google Analytics UA 编号的正则表达式

    我并不是 100 清楚 Google Analytics UA 编号始终是 6 位数字 一个破折号和 2 位数字 正如 Google 在其文档中经常提到的那样 常见的反例是帐户部分使用少于 6 个 配置文件使用少于 1 4 个 所有示例都始
  • WCAG:应用样式时,Firefox 和 Edge 不会在焦点输入元素上显示轮廓

    我正在创建一个表单 它遵循一些 WCAG 准则 其中之一是 G165 使用平台的默认焦点指示器 以便继承高可见度的默认焦点指示器 https www w3 org TR 2016 NOTE WCAG20 TECHS 20161007 G16
  • 不同日志文件中不同级别的日志

    我们如何编写一个简单的 log4j2 xml 文件 将不同级别的日志放入不同的文件中 例如 我们有错误日志和任何信息日志 我需要将所有错误日志消息推送到一个日志文件中 并将所有信息日志消息推送到另一个文件中 我希望 InfoControll
  • 在 Eval 中设置变量 (JavaScript)

    我正在编写一个 GreaseMonkey 脚本 使用 JQuery 并且我需要一些由原始页面中的脚本设置的变量 如下所示 我从另一个页面获取这个元素并尝试评估它 奇怪的是这不起作用 get link url null function da
  • golang中的[]string和...string有什么区别?

    在 Go 语言中 string是一个字符串数组 我们还使用 string作为参数 有什么不同 函数定义 func f args string 我可以像下面这样调用这个函数吗 args string a b f args string是一个字
  • c中的double和float可以存储多大的数字?

    我试图弄清楚我可以使用多大的数字作为浮点数double 但除了整数值之外 它并没有按照我预期的方式存储 double应该保存 8 个字节的信息 足以保存变量 a 但它保存得不正确 表明1234567890123456768其中最后 2 位数
  • 如何从 Django QuerySet 获取绝对图像 URL 列表?

    在 Django 中 当您使用 CDN 提供媒体文件时 构建图像 URL 的绝对路径的最佳方法是什么 就我而言 我有一个 Movie 对象的 QuerySet 并且我想检索电影的图像属性的绝对 URL 其中图像是 ImageField 有没
  • http 请求每 x 秒一次(角度)

    我试图在 angular2 中每 x 秒刷新一次 http 调用 ionViewDidLoad let loader this LoadingController create content Please Wait loader pres
  • Linux Bash:将多个不同的文件移动到同一目录中

    作为一个相当新手的 Linux 用户 我似乎不知道如何做到这一点 我正在尝试将一个目录中的所有唯一文件移动到另一个目录中 例子 ls vehicle car txt bicycle txt airplane html train docx
  • 查找到节点的连接边数以及具有最大连接边的节点

    在图中 如何找到与节点相连 直接绑定 的边数 然后 这将是微不足道的 但如果有任何直接方法来找到具有最大边连接的唯一节点 那就太好了 我正在使用 Python 2 7 和 Networkx 到目前为止 我正在这样做 sG list nx c
  • vite无法处理xxx.html文件

    我有一个 Vue2 的 Vite 项目 它包含一个静态 html 文件 喜欢关注 import template from editor html export default template template 当我跑的时候yarn de
  • 如何获得比 HostingEnvironment.ShutdownReason 更详细的有关 ASP.NET 应用程序重新启动的详细信息?

    我正在对 ASP NET 应用程序中的重新启动进行故障排除 该应用程序每天重新启动大约 20 次 我正在使用 log4net 库进行日志记录 遵循以下建议这个问题 https stackoverflow com questions 8293
  • 在 PHP 控制器中调用模型功能的最佳选择

    我正在使用 PHP 构建自定义 MVC 框架 我的问题是当我想通过控制器类访问任何模型类时 我见过的一种方法是通过使用 get 和 set 等神奇方法的注册表设计模式 尽管 PHP get 和 set 被一些人认为是不好的做法 我读过有关通
  • 如何使用 JPA 和 Hibernate 自动序列化和反序列化 JSON 字符串?

    我有数据类 表 用户 其中有 首选项 列 CREATE table user ALTER TABLE user ADD COLUMN preferences TEXT 首选项类型是 TEXT 我在那里存储 JSON public class