当前位置: 首页 > 面试题库 >

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

阎经武
2023-03-14
问题内容

我有数据类/表“ User”,其中有“ preferences”列

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

首选项类型为TEXT,我在其中存储JSON。

public class User extends AbstractEntity{
public String preferences;
}

所以user.preferences价值是"{notifyByEmail:1, favouriteColor:"blue" }"

如何使用一些注释将其包装起来,以便像

user.preferences.notifyByEmail

或无需包装到数据对象中

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

我想可能会有一些Jackson注释可以添加到字段中,例如

@JsonGenerate
public String preferences;

我对JPA相当陌生,文档非常丰富。

我相信我的情况很普遍。谁能举任何例子?


问题答案:

老实说,我认为最好的解决方案是为属性创建一个单独的表(首选项)。

+------------+
| preference |
+------------+---------+------+-----+
| Field      | Type    | Null | Key |
+------------+---------+------+-----+
| user_id    | bigint  | NO   | PRI |
| key        | varchar | NO   | PRI |
| value      | varchar | NO   |     |
+------------+---------+------+-----+

您可以这样在您的实体中进行映射:

@Entity
public class User
{
    @Id
    private Long id;

    @ElementCollection
    @MapKeyColumn(name = "key")
    @Column(name = "value")
    @CollectionTable(name = "preference",
        joinColumns = @JoinColumn(name = "user_id"))
    private Map<String, String> preferences;
}

这样,您的数据库就可以更规范化,而您也不必无所事事,例如将首选项存储为JSON之类的“创意解决方案”。



 类似资料:
  • 问题内容: 我是C ++的新手。使用序列化和反序列化类型数据的最简单方法是什么。我发现了一些使用示例,但它们对我来说是晦涩的。 问题答案: 请注意,将键解释为路径,例如,将对“ ab” =“ z”放置将创建{“ a”:{“ b”:“ z”}} JSON,而不是{“ ab”:“ z”} 。否则,使用是微不足道的。这是一个小例子。

  • 问题内容: 我很好奇序列化和反序列化的方式。我使用关键字“ json”和“ tuple”进行搜索,但找不到所需的内容。 问题答案: 我通过和Json.net进行测试,测试代码如下。结果显示可序列化和可反序列化。因此,我可以在应用程序中使用它们。 测试代码 注释 在将序列化到字符串{“项目1”:“一”,“项目2”:“嘻嘻”,“项目3”:真正},并且它可以被反序列化回类型。

  • 问题内容: 我正在寻找一种在Swift中自动序列化和反序列化类实例的方法。假设我们定义了以下类…… …和实例: 的JSON表示形式如下: 现在,这是我的问题: 我如何序列化实例并获取上面的JSON,而不必手动将类的所有属性添加到变成JSON的字典中? 我如何反序列化上面的JSON并获取静态类型为类型的实例化对象?同样,我不想手动映射属性。 这是使用Json.NET在C#中执行此操作的方法: 问题答

  • 问题内容: 我有一个问题。我想使用JAXB将一个对象转换为另一个对象。就像在中,我有一个class 和另一个class ,它们都有相同的参数,实际上都是相同的(复制粘贴),但是包不同。我想使用进行它们之间的转换。 怎么做,请帮帮我。 问题答案: 您可以执行以下操作。 注意: 不需要利用JAXBSource将数据具体化为XML。 它在对象模型上不需要任何注释。 com.home.Student co

  • 有没有一种方法可以指定不同的序列化/反序列化JSON字段名,而不必显式地写出getter和setter方法,或许可以使用lombok getter和setter? 与此示例类似,下面的代码允许将传入的JSON反序列化为不同的POJO字段名。它还会使POJO字段名序列化为: 但这当然是不成立的。

  • 问题内容: 我注意到存储在Redis中的某些序列化对象在反序列化方面遇到问题。 当我对Redis中存储的对象类进行更改时,通常会发生这种情况。 我想了解问题,以便为解决方案设计一个清晰的方案。 我的问题是,什么导致反序列化问题?移除公共/私人财产会引起问题吗?也许添加新属性?向类添加新功能会产生问题吗?那么更多的构造函数呢? 在我的序列化对象中,我有一个属性Map,如果我更改(更新了一些属性,添加