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

Hibernate mapping between different database and domain model

我已经创建了域和数据库模型。域模型是休息api。两者都有类似的组件,如产品、类别、客户、零售商等……但如果你仔细观察这两种模型。你可以看到一些差异。例如,您可以看到在数据库模型中零售商有多种产品。但在域模型中,您可以看到每个产品都有一个零售商。这样做的原因是因为我需要能够 return 不同零售商的多种产品列表。

在领域模型中也可以看到产品有productproperties。在数据库中,这也以不同于域模型的方式完成。数据库模型有一列属性(例如:高度、重量、分辨率等)。在数据库中,产品有一个产品属性,它有一个值和一个属性。

领域模型:

数据库model/design:

我对 Hibernate 做了一些研究,并做了一个测试项目来了解这个映射是如何工作的。我有一个简单的项目在工作。但是当我开始使用这些模型创建项目时,我陷入了困境。我找不到实现它的方法 work.I 读过一些关于“POJOs”的东西 所以也许解决方案是为数据库创建 pojos 然后将它们映射到我的域模型,但我不是确定这一点。所以我的问题是如何创建一个数据库,比如带有休眠映射的域模型的模型?

PS:我知道数据库模型没有完全与领域模型同步。

对于 Hibernate 映射,您应该使用数据库模型,因为这些模型直接映射到数据库字段。域 models/POJOs 应该在控制器方法中使用,这也提供了一层安全性,因为如果您决定修改数据库 table.

,您的 API 不会受到影响

这个问题没有简单的答案,因为您要问的是:

please make this work.

您应该从休眠 java classes(自上而下)生成 DDL,或者从 [=37] 生成休眠 java classes =](自下而上)。

hibernate 直接支持自上而下的方法 - 仅 google 用于使用 hibernate 生成 DDL。

IntelliJ IDEA 支持自下而上的方法。这篇博文解释了如何做到这一点:https://jpdevelopment.blogspot.com/2015/11/create-entity-objects-from-db-schema.html

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

为不同的目的开发休眠 classes 和数据库架构会导致您不希望出现的映射问题。

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

你应该如何继续?

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

使用这种方法,如果映射有效,您会立即得到反馈。

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