我不太清楚如何给这个问题加上标题,因此如有需要,可以随时对其进行编辑。

我对jpa / spring有点陌生,我发现一个问题,我认为这应该很普遍,但我找不到任何合理的答案。

我正在用springboot创建RestAPI。该API有2个端点(GET)/ user和(GET)/ address,它们将1:1映射到数据库中的实体。它们之间的关系是1:N,由user_id加入。

我想到的想法是,根据调用的端点,返回完全填充的实体(带有其地址的用户或填充了用户的地址列表)。

我尝试使用jpa注释OneToMany / ManyToOne,因此hibernate会自动解决此问题,但是在这种情况下,我还需要使用Jackson注释的字段进行注释,这些字段是静态的,并且会破坏我的端点之一。 (我可以让用户获得地址,或获得用户的地址,但不能同时获得两者)

我发现的选择b)是打破关系,在实体中保留id,然后将完整对象设置为临时对象,然后在代码中填充它们。因为manyToOne关系很容易进行映射,但是对于OneToMany来说就不那么容易了,因为我必须获取所有地址,所有用户并通过代码进行映射。我希望有大量的用户和地址,所以这可能会很昂贵。

对此的另一种可能的解决方案,但我还没有找到如何做到这一点,当在控制器中序列化为json时,是否能够将递归限制为1级,但是我没有看到如何做到这一点。

也可以通过使用自定义jql / sql查询填充具有标准连接的瞬态字段来完成。

对于给出的示例,让我们想象一下表看起来像这样:

User:
 - id: long autoincrement (PK)
 - name: varchar(255)

Address:
 - id long autoincrement (PK)
 - user_id long,
 - street varchar(255)


非常感谢,并感谢您的大文字

最佳答案

最终,我找到了一种以不太肮脏的方式实现这一目标的方法。

我为每个实例创建了一个接口,而没有使用方法创建将创建Jackson序列化类的循环引用的接口。

在实体的属性上使用@JsonSerialize(as = MyInterface.class)将使其递归(用户中的地址和用户中的地址)

这样,您就可以在json中保留1个深度级别,同时可以实现类的“动态”序列化

09-10 10:09
查看更多