在 Spring Boot 中将数据库(JPA)对象与前端数据分离
Separation of database(JPA) objects from data for the frontend in SpringBoot
我目前正在开发一个全栈网络应用程序作为一个业余项目。
我的技术栈是:
- MySql 数据库
- SpringBoot RestApi 后端与 JPA 用于数据库交互
- Vue 前端
我已经为数据库建模并为数据库中的所有表创建了 jpa 实体。数据模型包括一些双向关系(多对多关系)。然后我开始创建一些 API 端点供前端交互,但我在决定如何序列化数据并将其发送到前端时遇到了一些问题。
在大多数教程和示例中,直接类似于数据库对象的对象被序列化,然后发送到前端。但我不希望那样,主要是因为创建不可序列化递归的双向关系,而且还因为并非数据库中对象的所有数据都应该发送到前端。
所以我想知道数据库(jpa)对象和序列化后发送给前端的对象之间的separation/conversion通常是如何实现的
我有一些想法,但我不知道它们在现实世界中的可行性如何:
想法 1:为所有实体创建单独的前端 类,只包含必须发送到前端的数据。
但这可能会产生额外的问题,因为每个 request/answer.
中 类 之间的连续转换
想法 2:仅发送具有所有关系的“原始”对象作为 ID,并阻止所有“不需要的”数据进行序列化。
在这种情况下,前端现在必须向后端发出更多请求,以便将所有这些 ID 解析为所需数据。
想法 1 正是通常的做法。您所说的“前端类”通常称为数据传输对象(DTO),它们本质上是存储在数据库中的数据的“视图”,专门为从后端到前端传输的有效性而量身定制(通过聚合多个相关实体)和前端的易用性(显示)。
转换问题是一个已知问题,并且已被所谓的“映射器”成功解决,该映射器允许在 DB 实体和 DTO 之间进行(半)自动转换。这种映射器的一个很好的例子是 MapStruct
(https://mapstruct.org/documentation/stable/reference/html/),它很好地集成了 Spring 和 Lombok,并在 IntelliJ Idea 中得到支持。
我目前正在开发一个全栈网络应用程序作为一个业余项目。
我的技术栈是:
- MySql 数据库
- SpringBoot RestApi 后端与 JPA 用于数据库交互
- Vue 前端
我已经为数据库建模并为数据库中的所有表创建了 jpa 实体。数据模型包括一些双向关系(多对多关系)。然后我开始创建一些 API 端点供前端交互,但我在决定如何序列化数据并将其发送到前端时遇到了一些问题。
在大多数教程和示例中,直接类似于数据库对象的对象被序列化,然后发送到前端。但我不希望那样,主要是因为创建不可序列化递归的双向关系,而且还因为并非数据库中对象的所有数据都应该发送到前端。
所以我想知道数据库(jpa)对象和序列化后发送给前端的对象之间的separation/conversion通常是如何实现的
我有一些想法,但我不知道它们在现实世界中的可行性如何:
想法 1:为所有实体创建单独的前端 类,只包含必须发送到前端的数据。 但这可能会产生额外的问题,因为每个 request/answer.
中 类 之间的连续转换想法 2:仅发送具有所有关系的“原始”对象作为 ID,并阻止所有“不需要的”数据进行序列化。 在这种情况下,前端现在必须向后端发出更多请求,以便将所有这些 ID 解析为所需数据。
想法 1 正是通常的做法。您所说的“前端类”通常称为数据传输对象(DTO),它们本质上是存储在数据库中的数据的“视图”,专门为从后端到前端传输的有效性而量身定制(通过聚合多个相关实体)和前端的易用性(显示)。
转换问题是一个已知问题,并且已被所谓的“映射器”成功解决,该映射器允许在 DB 实体和 DTO 之间进行(半)自动转换。这种映射器的一个很好的例子是 MapStruct
(https://mapstruct.org/documentation/stable/reference/html/),它很好地集成了 Spring 和 Lombok,并在 IntelliJ Idea 中得到支持。