有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
有没有更好的方法来做到这一点,或者我的计划方法有利于开始?
POJO
模型我同意,对于POJO
和Hibernate
库使用相同的Jackson
结构并不是最好的选择,一般来说。但它也取决于您需要实施的特定方案。在您的情况下,您需要从REST API
加载数据并将结果存储在DB
中。所以,基本上你会在90%的情况下调用INSERT
查询。所以,你可以保持你的POJO
结构非常简单,而不用担心任何lazy-loading
问题。在这种情况下使用相同的POJO
结构并不是那么糟糕。链接的问题/答案只是说DB
读取和暴露REST API
结构的问题,这不是这个问题的案例。
您还需要了解DB
模型与JSON
模型的不同之处。如果他们是相似的,你可以说1:1
没有必要创建额外的图层。
POJO
模型在这种情况下,您需要创建两个POJO
模型:一个用于处理JSON
反序列化,另一个用于通过DB
与ORM
一起工作。在这种情况下,最大的问题是映射这两个模型。此外,REST API
的变化在每一层上传播。您可以使用课程地图库,如Dozer,Orika,MapStruct或其他,但始终需要维护此层。从另一方面来看,这是非常安全的解决方案,因为你可以分别控制到JSON
和DB
的映射,并保持不同的结构,没有很多注释或自定义解串器,适配器等。另一方面,如果这两个模型真的不同,这个解决方案是最好的。
POJO
模型还有第三个选项,我看到它正在使用Java
集合库来处理JSON
有效载荷。 JSON Object
适合Map<String, Object>
和JSON array
适合List<Object>
。 Jackson
自动注意选择正确的类型,你只需将这些集合映射到POJO
侧使用的ORM
模型。该解决方案消除了保留两个模型的需要,但它使映射层复杂化并使其模糊。
根据您提供的信息,我将从第一个选项开始。如果事情会变得复杂,在一些库的帮助下生成额外的模型和映射层应该不是一个大问题。
一般来说,这种方法是正确的。但细节取决于您将要使用的框架/ ORM(如果有的话)。
如果你想使用JPA / Hibernate进行持久化 - 你需要一个Entity类,它永远不能用作DTO。如果你有一些自定义持久性,你可以完全跳过实体类,只需使用DTO来填充查询参数。
但实现这种解决方案的最简单和最常见的方法是使用Spring框架,它将使用Jackson自动将您的JSON映射到DTO,并使用Spring Data JPA进行持久化。
在这种情况下,剩下的唯一工作是将DTO映射到实体。这可以手动实现,但也可以使用生成映射器的框架来完成 - 比如MapStruct。