我创建了一个域和数据库模型。域模型用于rest。它们都有相似的部件,如产品、类别、客户、零售商等。但如果你仔细看看这两种模型。你可以看到一些不同之处。例如,您可以看到,在数据库模型中,零售商有多个产品。但是在域模型中,您可以看到每个产品都有一个零售商。这样做的原因是因为我需要能够向不同的零售商返回多个产品的列表。
您还可以在域模型中看到产品具有产品属性。在数据库中,这也是以与域模型不同的方式完成的。数据库模型有一列属性(例如:高度、重量、分辨率等)。在数据库中,产品具有一个具有值和属性的productproperty。
域模型:

数据库模型/设计:

我对Hibernate做了一些研究,并做了一个测试项目来了解这个映射是如何工作的。我有个简单的项目在工作。但是当我开始用这些模型创建一个项目时,我被困住了。我找不到办法让它起作用,我读过一些关于" pojos“的文章,所以也许一个解决方案是为数据库创建pojos,然后将它们映射到我的域模型,但我不确定。那么,我的问题是如何使用hibernate映射创建一个像域模型这样的数据库呢?
PS:我知道数据库模型与域模型不完全同步。
发布于 2020-10-20 19:21:14
这是一个问题,没有一个简单的答案,因为你要求的东西如下:
请把这件事做好。
您应该从hibernate java类(自上而下)生成DDL,或者从DB中生成hibernate java类(自下而上)。
hibertnate直接支持自顶向下的方法--只支持google使用hibernate生成DDL。
IntelliJ IDEA支持自下而上的方法。这篇博客文章解释了如何做到这一点:https://jpdevelopment.blogspot.com/2015/11/create-entity-objects-from-db-schema.html
我建议您遵循自上而下的方法,因为这是工具的独立和更好的支持。
为了不同的目的开发hibernate类和数据库模式会导致您不想要的映射问题。
此外,您正在讨论用于REST的domain模型。我建议您使用hibernate java类模型作为内部域模型--可能并不完美,但足够好。REST类模型暴露于外部世界,对该模型的更改应该谨慎进行,因为当您更改该模型时,可能会破坏您的一些消费者。
你应该怎么继续?
你应该采用自上而下的方法。尽可能创建反映实体关系图的java类,向它们添加hibernate注释,在启动时使用drop-create删除和重新调用模式(读取https://thorben-janssen.com/standardized-schema-generation-data-loading-jpa-2-1/),并确保应用程序启动,尽可能快地成功创建模式。
通过这种方法,如果映射有效,您将立即得到反馈。
更多进展:使用Unit对真实的数据库进行测试,以确保hibernate模型按预期工作。
发布于 2020-10-20 19:11:20
对于Hibernate映射,您应该使用数据库模型,因为这些模型直接映射到数据库字段。域模型/POJO应该在Controller方法中使用,这些方法还提供了一层安全性,因为如果您决定修改数据库表,您的apis不会受到影响。
https://stackoverflow.com/questions/64451699
复制相似问题