java - jpa oneToMany和jackson序列化问题(新手)
问题描述
我不太清楚如何为这个问题命名,所以如果需要,请随时编辑它。
我对 jpa/spring 有点陌生,我发现了一个我认为应该很常见的问题,但我找不到任何合理的答案。
我正在用 springboot 创建一个 RestAPI。此 API 有 2 个端点 (GET) /user和(GET) /address,它们以 1:1 的比例映射到我的数据库中的实体。它们之间的关系是 1:N,由 user_id 加入。
我想到的想法是,根据调用哪个端点,返回完全填充的实体(用户的地址或用户填充的地址列表)。
我曾尝试使用jpa 注释 OneToMany/ManyToOne,因此休眠会自动解决此问题,但在这种情况下,我还需要使用 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 个深度级别,您可以实现类的“动态”序列化
推荐阅读
- javascript - Salesforce 在线潜在客户表单的条件逻辑
- python - 使用python使用给定的字符串迭代数据框
- javascript - 使用 JavaScript 检查照片的大小
- visual-studio-code - 如何在 vscode 中同时显示内部终端和调试控制台?
- firebase - Firebase获取请求查询多个表
- python - 如何使任何用户的路径目录通用和动态?
- javascript - Node JS - 单击按钮时从 index.html 访问 JSON
- apache-nifi - 无法使用 Jolt 转换转换为以下格式的 json
- google-calendar-api - 用于提醒的 Google 日历 API 通知
- flutter - iOS Flutter 中不出现 FCM 的通知