【问题标题】:Hibernate mapping between different database and domain model不同数据库和域模型之间的休眠映射
【发布时间】:2021-02-03 16:01:13
【问题描述】:

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

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

领域模型:

数据库模型/设计:

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

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

【问题讨论】:

    标签: java hibernate intellij-idea nhibernate-mapping


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回复。您是否有示例说明如何执行此操作?
    【解决方案2】:

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

    请做好这项工作。

    您应该从 hibernate java 类(自上而下)生成 DDL,或者从 DB-Schema 生成 hibernate java 类(自下而上)。

    hibernate 直接支持自上而下的方法 - 只需 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/)并确保应用程序启动,尽快成功创建模式尽可能。

    通过这种方法,如果映射成功,您会立即获得反馈。

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

    【讨论】:

    • 非常感谢您的回复。我将看看自上而下和自下而上的方法。但是你会推荐哪一个?
    • @dirk.z 见休眠documentation:Although the automatic schema generation is very useful for testing and prototyping purposes, in a production environment, it’s much more flexible to manage the schema using incremental migration scripts.
    • 更新了答案。是的,如果您要进行自动化生产部署。我建议使用flywaydb.org 作为数据库迁移工具。
    猜你喜欢
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 2021-01-19
    • 1970-01-01
    • 1970-01-01
    • 2013-11-07
    • 1970-01-01
    相关资源
    最近更新 更多