在RDBMS中保存REST API JSON

问题描述 投票:1回答:2

有Web API和REST API。我必须使用JSON格式的API,然后将其保存在RDBMS中。 JSON基本上是属性和子属性的列表。我必须将它们映射到数据库列。

DB Schema尚未创建我认为合适的任何内容。我正在寻找的是将JSON映射到Java DTO然后将DTO映射到实体的最佳方法。我计划使用JACKSON将JSON映射到DTO。我可能会也可能不会映射所有属性。然后在下一步中,我计划编写将DTO映射到Entity的手动映射器。

我必须使用RDBMS(MySQL)而不是NoSQL,因为从DB读取数据的其他工具是基于SQL查询的。

编辑:应该使用RDBMS的商业报表工具具有一些有限的SQL查询功能,不能在那里执行任何高级SQL或业务逻辑。所以我不能将JSON保存为字符串,然后在报告工具中将其标记。

有什么想法吗?我知道它可以直接用JSON实体完成,但有建议不要这样做这个建议:Mapping JSON object to Hibernate entity

有没有更好的方法来做到这一点,或者我的计划方法有利于开始?

java mysql json rest jackson
2个回答
1
投票

只有一个POJO模型

我同意,对于POJOHibernate库使用相同的Jackson结构并不是最好的选择,一般来说。但它也取决于您需要实施的特定方案。在您的情况下,您需要从REST API加载数据并将结果存储在DB中。所以,基本上你会在90%的情况下调用INSERT查询。所以,你可以保持你的POJO结构非常简单,而不用担心任何lazy-loading问题。在这种情况下使用相同的POJO结构并不是那么糟糕。链接的问题/答案只是说DB读取和暴露REST API结构的问题,这不是这个问题的案例。

您还需要了解DB模型与JSON模型的不同之处。如果他们是相似的,你可以说1:1没有必要创建额外的图层。

两个POJO模型

在这种情况下,您需要创建两个POJO模型:一个用于处理JSON反序列化,另一个用于通过DBORM一起工作。在这种情况下,最大的问题是映射这两个模型。此外,REST API的变化在每一层上传播。您可以使用课程地图库,如DozerOrikaMapStruct或其他,但始终需要维护此层。从另一方面来看,这是非常安全的解决方案,因为你可以分别控制到JSONDB的映射,并保持不同的结构,没有很多注释或自定义解串器,适配器等。另一方面,如果这两个模型真的不同,这个解决方案是最好的。

收藏和一个POJO模型

还有第三个选项,我看到它正在使用Java集合库来处理JSON有效载荷。 JSON Object适合Map<String, Object>JSON array适合List<Object>Jackson自动注意选择正确的类型,你只需将这些集合映射到POJO侧使用的ORM模型。该解决方案消除了保留两个模型的需要,但它使映射层复杂化并使其模糊。

根据您提供的信息,我将从第一个选项开始。如果事情会变得复杂,在一些库的帮助下生成额外的模型和映射层应该不是一个大问题。


1
投票

一般来说,这种方法是正确的。但细节取决于您将要使用的框架/ ORM(如果有的话)。

如果你想使用JPA / Hibernate进行持久化 - 你需要一个Entity类,它永远不能用作DTO。如果你有一些自定义持久性,你可以完全跳过实体类,只需使用DTO来填充查询参数。

但实现这种解决方案的最简单和最常见的方法是使用Spring框架,它将使用Jackson自动将您的JSON映射到DTO,并使用Spring Data JPA进行持久化。

在这种情况下,剩下的唯一工作是将DTO映射到实体。这可以手动实现,但也可以使用生成映射器的框架来完成 - 比如MapStruct

© www.soinside.com 2019 - 2024. All rights reserved.