不同数据库和域模型之间的Hibernate映射

问题描述

我已经创建了域和数据库模型。域模型用于rest api。两者都有相似的组件,例如产品,类别,客户,零售商等。但是,如果您仔细看一下这两种模型,就可以了。您会看到一些差异。例如,您可以看到零售商在数据库模型中有多种产品。但是在域模型中,您可以看到每个产品都有一个零售商。这样做的原因是因为我需要能够返回具有不同零售商的多种产品的列表。

您还可以在域模型中看到该产品具有productproperties。在数据库中,这也可以通过与域模型不同的方式来完成。数据库模型具有一列属性(例如:高度,重量,分辨率等。)。在数据库中,产品的产品属性具有值和属性

域模型:

Domain model

数据库模型/设计:

Database model

我对Hibernate进行了一些研究,并做了一个测试项目,以了解这种映射的工作方式。我有一个简单的项目正在工作。但是,当我开始使用这些模型创建项目时,我陷入了困境。我找不到一种使它工作的方法。我确实读过一些有关“ POJO”的信息,所以也许一种解决方案是为数据库创建pojo,然后将它们映射到我的域模型,但是我不确定那。所以我的问题是如何使用休眠映射创建具有域模型的数据库

PS:我知道数据库模型不是与领域模型完全一致的。

解决方法

对于Hibernate映射,您应该使用数据库模型,因为这些模型直接与数据库字段进行映射。领域模型/ POJO应在Controller方法中使用,该方法还应提供一层安全保护,因为如果您决定修改数据库表,则api不会受到影响。

,

这是一个没有简单答案的问题,因为您要输入的内容如下:

请使此工作。

您应该从休眠Java类生成DDL(自上而下),或者从DB-Schema生成Hibernate Java类(自下而上)。

hibertnate直接支持自上而下的方法-只需使用google即可使用hibernate生成DDL。

IntelliJ IDEA支持自下而上的方法。这篇博客文章解释了如何完成此操作:https://jpdevelopment.blogspot.com/2015/11/create-entity-objects-from-db-schema.html

我建议您遵循自上而下的方法,因为这是独立于工具的,并且得到了更好的支持。

出于不同目的开发休眠类和数据库架构会导致映射您不想遇到的问题。

此外,您正在谈论的是用于REST API的domain模型。 我建议您将休眠的Java类模型用作内部域模型-可能并不完美,但足够好。 REST API类模型是暴露给外界的,对模型的更改应谨慎进行,因为在更改模型时,您可能会破坏一些消费者。

您应该如何继续?

您应该采用自上而下的方法。 创建尽可能反映您的实体关系图的Java类,向它们添加休眠注释,在启动时使用drop-create删除和恢复模式(请阅读https://thorben-janssen.com/standardized-schema-generation-data-loading-jpa-2-1/),并确保应用程序启动,创建模式尽快成功。

通过这种方法,如果映射有效,您将立即获得反馈。

更多进步:对真实数据库使用单元测试,以确保您的休眠模型按预期工作。