我有两个实体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执行查找。
这是一种合理的方法吗?
答案 0 :(得分:2)
另一个选择是创建一个接受这些参数的构造函数,用@JsonCreator
注释它并让构造函数从数据库执行查找,这样就不需要编写特定的反序列化器。
答案 1 :(得分:2)
你可以使用@JsonCreator
(正如Uri Shalit已经建议的那样),或者只使用你的属性的setter方法,在那里你可以从数据库中进行必要的查找。
但是,如果您有许多要执行此操作的实体(和关联),那么这可能是重复的样板代码。此外,如果直接在实体类中实现,它将使用数据库查找代码(可读性,SRP等)污染它们。
如果你想要一些通用的方法,那么我认为你是一个好方法;自定义反序列化器是实现它的地方。
如果我要实现通用方法,我可能会引入一个自定义注释,我将它放在关联定义和标准JPA注释上。例如:
@MyCustomJsonIds("visitedCountryIds")
@ManyToMany(...)
private List<Country> countries;
然后,在解串器中,我会查询是否存在这些注释,以动态确定需要从数据库中查找的内容。