当使用Hibernate ORM时,我应该首先建模类图还是数据库图



我对Java和Hibernate相当陌生。在工作中,我们正在使用Spring、Hibernate、JBOSS等开发一个中等规模的、用于表单处理的J2EE web应用程序。使用Hibernate的正确方法是什么?我应该先创建一个类图,并使用hibernate映射到DB表,还是应该先对DB表建模,然后映射到hibernate实体?还是视情况而定?如果它取决于什么?这两种方法是否有缺点?是否有可能将"任何"类图映射到使用Hibernate 4的DB ?

两种方法都是正确的,只是在不同的情况下使用。

  1. 创建新应用(新模型)时,通常先创建实体,然后让hibernate/JPA创建表。它更简单,可能会生成更好的对象模型(因为您是直接创建的)。但是你仍然要记住,你正在创建数据库表,所以你也应该考虑数据库规范化等。
  2. 在映射一些遗留模式时,您将首先使用表的方法,在这种情况下,您别无选择,只能这样做。对象模型可能有点笨拙…

但是我重复一下,两种方法都是有效的,如果您是DB工程师而不是Java程序员,您可能会选择2),因为它对您来说可能更自然。作为一个Java程序员,我(几乎)总是1)…

你可以用两种方法得到相同的结果,在这两种方法中,你必须考虑,hibernate将为你生成什么…

这没有任何区别:两者都可以映射到另一个,但是您需要注意两者(ORM阻抗不匹配)。

如果你正在做绿地开发,依我看,从类图=> DB表开始;在课堂上更容易思考。一般来说,合理的类结构很好地映射到DB表,但要记住效率("be aware"部分)。

我认为清楚地识别您的实体及其之间的关系是非常重要的,因为它们是您在java世界中对领域世界中实际问题的表示。确保你的实体在业务术语上有对应的人。事实上,这本身就是一个完整的问题,有几种方法(例如DDD)。明确定义实体之后,还应该考虑应用程序的主要目的是什么。您可以基于hibernate对它进行不同的映射。

例如,为读取优化的持久层可以使用规范化程度较低的DB设计,其中的冗余可能会给您带来额外的速度。用Hibernate的术语来说,这意味着为您的对象层次结构(假设您有一个)选择合适的Hibernate继承映射,或者依赖于fetch-join进行批量读取。延迟加载集合也可以提供帮助,但是,这是在您定义了实体之后才能完成的事情。

我认为另一件重要的事情是确定哪些实体是聚合实体,换句话说,哪些实体具有明确的身份,它们自己的生命周期,这意味着您要明确查询哪些实体。其他的(它们的依赖)通常通过级联操作来管理。

保持实体之间的关系简单,尽可能避免双向关系。

不确定这篇文章是否真的是你所需要的——底线是,至少对于一个初学者来说,从类开始,保持简单(单向),并确保你没有映射没有商业意义的东西,除非你真的——真的必须!

我不同意其他答案,您应该努力采用数据库模型优先方法一般(尽管可能有一些特殊的小情况,对象模型优先方法更好)。

关系模型很久以前就已经继承了网络模型(OO,图形数据库)和层次模型(JSON, XML),提供了优于其他数据表示的优势,即使这些模型在技术上可以相互转换。从长远来看,使用数据库供应商的DDL来发展一个设计良好、规范化的模式要比计算如何从OO模型增量生成DDL和更新语句容易得多。

在我看来,你的客户端模型只是你的数据库模型的派生版本,它并不能完全代表你的整个领域。相反,数据库和数据访问层是整个系统的一个子系统。在这个子系统中,关系模型应该是王道。派生实体应该是…派生的,例如通过使用代码生成器。

最新更新