【问题标题】:Deserializing json and resolving JPA entities反序列化 json 并解析 JPA 实体
【发布时间】:2015-06-17 17:43:18
【问题描述】:

我有两个实体 X 和 Y,关系为 @ManyToMany。 X 有一个 Y 的列表,我们称之为 yList。 X 和 Y 都有其他类成员(它们并不重要)。

我使用 Hibernate 作为 JPA 提供程序,使用 jackson-databind / jackson-annotations 进行序列化和反序列化等思想。

现在,从客户端接收到以下 json。它具有 X 的所有字段,但只有 Y 的 id 列表。作为具体示例,X 可以是 Person,Y 可以是 Country。并且多对多关系捕获了谁访问了哪些国家。

{ 
  name: 'Bob Dylan',
  age: '74',
  visitedCountryIds: ['45', '23', '85']
}

在反序列化这个 json 时,我想填充实体 X 的所有字段,包括 yList,以便通过在数据库中查找这些实体来解析 yList 的元素。

到目前为止,我的想法是通过编写 JsonDeserializer 的自定义子类来反序列化 yList,并让它通过 id 执行查找。

这是一个合理的方法吗?

【问题讨论】:

    标签: json jpa jackson deserialization


    【解决方案1】:

    您可以使用@JsonCreator(正如 Uri Shalit 已经建议的那样)或只是为您的属性使用 setter 方法,您可以在其中从数据库中进行必要的查找。

    但是,如果您有许多要执行此操作的实体(和关联),则这可能是重复的样板代码。此外,如果直接在实体类中实现,则会被数据库查找代码(可读性、SRP 等)污染。

    如果你想要一些通用的方法来解决这个问题,那么我认为你的方法很好;自定义反序列化器是实现它的地方。

    如果我要实现通用方法,我可能会引入一个自定义注释,我会将其与标准 JPA 注释一起放置在关联定义中。例如:

    @MyCustomJsonIds("visitedCountryIds")
    @ManyToMany(...)
    private List<Country> countries;
    

    然后,在反序列化器中,我会查询这些注释是否存在,以动态确定需要从数据库中查找的内容。

    【讨论】:

      【解决方案2】:

      另一种选择是创建一个接受这些参数的构造函数,用@JsonCreator 对其进行注释并让构造函数从数据库中执行查找,这样您就不需要编写特定的反序列化器。

      【讨论】:

        猜你喜欢
        • 2014-07-08
        • 2015-09-21
        • 2016-02-16
        • 1970-01-01
        • 1970-01-01
        • 2014-10-24
        • 2023-03-30
        • 1970-01-01
        • 2011-06-07
        相关资源
        最近更新 更多