当前位置: 首页 > 知识库问答 >
问题:

SpringBoot中前端数据库(JPA)对象与数据的分离

庾兴发
2023-03-14

作为一个爱好项目,我目前正在开发一个全堆栈的web应用程序。

我的技术堆栈是:

我已经对数据库进行了建模,并为数据库中的所有表创建了jpa实体。数据模型包括一些双向关系(多对多关系)。然后,我开始为前端创建一些APIendpoint进行交互,但我在决定如何序列化数据并将其发送到前端时遇到了一些问题。

在大多数教程和示例中,与数据库对象直接相似的对象被序列化,然后发送到前端。但我不希望这样,主要是因为双向关系创建了不可分解的递归,但也因为并非数据库中对象的所有数据都要发送到前端。

所以我想知道数据库(jpa)对象和序列化然后发送到前端的对象之间的分离/转换通常是如何实现的。

我有一些想法,但我不知道它们在现实世界中有多可行:

想法1:为所有实体创建单独的前端类,其中只包含必须发送到前端的数据。但是这可能会产生额外的问题,因为每个请求/应答中的类之间会持续转换。

想法2:只将所有关系的“原始”对象作为ID发送,并阻止所有“不需要的”数据进行序列化。在这种情况下,前端现在必须向后端发出更多请求,以便将所有这些id解析为所需的数据。

共有1个答案

劳英华
2023-03-14

想法1正是通常的做法。您所称的“前端类”通常称为数据传输对象(DTO),它们本质上是存储在数据库中的数据的“视图”,专门为从后端传输到前端(通过多个相关实体的聚合)的有效性和前端的易用性(显示)而量身定制。

转换问题是一个众所周知的问题,通过允许DB实体和DTO之间(半)自动转换的所谓“映射器”可以非常成功地解决。这种映射器的一个很好的例子是MapStruct(https://mapstruct.org/documentation/stable/reference/html/)它与Spring和Lombok很好地集成,并在IntelliJ Idea中得到支持。

 类似资料:
  • 我正在尝试从mysql数据库中检索今天的记录。 和控制器代码: 我希望通过使用findByDate(...)获得今天的记录方法,但似乎不起作用。在查看MysqlWorkbench的数据时,我还注意到一个小问题:日期似乎提前了2小时(例如:现在是11:57,但在mysql workbench软件中显示的是9:57,当我查询服务器时间时,显示的是不正确的tme……)我其实不关心小时/分钟/秒,我只想检

  • SPT Object Database 是一个纯Java的对象数据库,采用 Prevayler 开发。

  • 我需要一个概念来设计一个使用Spring boot、Hibernate和JPA的多数据库应用程序。 目前我正在考虑支持4个关系数据库(Mysql,H2,SQLLite,Oracle)。 我所做的是使用spring boot profile特性选择正确的数据库profile,然后加载相关的数据库属性。

  • 问题内容: 谁能帮助我如何从数据库创建JSON对象? 这是 JSON输出的 样子: 这是 我的代码 : 我能够从数据库中获取选定的 类型,名称,演示 。 我不知道如何开始JSON编码。 问题答案: 如果要从数据库提取数据并自己构造JSON对象,则可以执行以下操作: 现在包含所有数据。

  • 我有一个实体CandidateTransaction和CandidateTransactionRepository扩展了CrudRepository 我正在使用CrudRepository的save方法来保存所述实体的对象。当实体没有行时,它将创建一个自动生成的键并将其插入ID列,而不需要Java端的干预。 而且,由于CrudRepository的save()方法检查实体是否是新的,如果是新的,它

  • 问题内容: 事实证明,以下示例在使用mysql 5.x时有效,但是在使用oracle 10g数据库时无效。 有没有一种方法可以定义独立于数据库技术的唯一标识符字段? 我已经在hibernate状态下对此进行了测试,并且只有在使用Oracle时才会发生以下异常: 问题答案: 我已经研究过使用,它的确是更好的选择。它允许JPA实现选择最适合您所使用的数据存储系统的任何东西。