JPA OneToMany 和 jackson 序列化问题(新手)



我不太知道如何为这个问题命名,所以如果需要,请随时编辑它。

我是 jpa/spring 的新手,我发现了一个我认为它应该很常见的问题,但我找不到任何合理的答案。

我正在创建一个带有springboot的RestAPI。此 API 有 2 个端点 (GET(/user 和 (GET(/地址,它们以 1:1 的比分映射到我的数据库中的实体。它们之间的关系是 1:N,由user_id连接。

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

我尝试使用jpa 注释 OneToMany/ManyToOne,因此休眠会自动解决此问题,但在这种情况下,我还需要使用杰克逊注释注释注释字段,这些注释是静态的,会破坏我的一个端点。(我可以获取带有地址的用户,或者带有用户的地址,但不能同时获得两者(

我发现的选项 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 个深度级别,您可以实现类的"动态"序列化

最新更新