反序列化 json 并解析 JPA 实体
Deserializing json and resolving JPA entities
我有两个实体 X 和 Y,关系为@ManyToMany。 X 有一个 Y 的列表,我们称它为 yList。 X 和 Y 都有其他 class 成员(他们并不重要)。
我将 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 的自定义子 class 来反序列化 yList,并让它通过 id 执行查找。
这是一个合理的方法吗?
另一种选择是创建一个接受这些参数的构造函数,用 @JsonCreator
注释它并让构造函数从数据库执行查找,这样您就不需要编写特定的反序列化程序。
您可以使用 @JsonCreator
(正如 Uri Shalit 已经建议的那样)或者只是 setter 方法用于您的 属性,您可以在其中从数据库中进行必要的查找。
但是,如果您有许多实体(和关联)要执行此操作,那么这可能是重复的样板代码。此外,如果直接在实体 类 中实现,它会用数据库查找代码(可读性、SRP 等)污染它们。
如果你想要一些通用的方法来解决这个问题,那么我认为你的方法很好;自定义解串器是实现它的地方。
如果我要实现通用方法,我可能会引入一个自定义注释,我会将其与标准 JPA 注释一起放置在关联定义中。例如:
@MyCustomJsonIds("visitedCountryIds")
@ManyToMany(...)
private List<Country> countries;
然后,在反序列化器中,我将查询是否存在这些注释,以动态确定需要从数据库中查找的内容。
我有两个实体 X 和 Y,关系为@ManyToMany。 X 有一个 Y 的列表,我们称它为 yList。 X 和 Y 都有其他 class 成员(他们并不重要)。
我将 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 的自定义子 class 来反序列化 yList,并让它通过 id 执行查找。
这是一个合理的方法吗?
另一种选择是创建一个接受这些参数的构造函数,用 @JsonCreator
注释它并让构造函数从数据库执行查找,这样您就不需要编写特定的反序列化程序。
您可以使用 @JsonCreator
(正如 Uri Shalit 已经建议的那样)或者只是 setter 方法用于您的 属性,您可以在其中从数据库中进行必要的查找。
但是,如果您有许多实体(和关联)要执行此操作,那么这可能是重复的样板代码。此外,如果直接在实体 类 中实现,它会用数据库查找代码(可读性、SRP 等)污染它们。
如果你想要一些通用的方法来解决这个问题,那么我认为你的方法很好;自定义解串器是实现它的地方。
如果我要实现通用方法,我可能会引入一个自定义注释,我会将其与标准 JPA 注释一起放置在关联定义中。例如:
@MyCustomJsonIds("visitedCountryIds")
@ManyToMany(...)
private List<Country> countries;
然后,在反序列化器中,我将查询是否存在这些注释,以动态确定需要从数据库中查找的内容。