当使用Hibernate ORM时,我应该首先建模类图或DB图吗?

时间:2011-10-08 15:00:21

标签: java hibernate class orm

我是Java和Hibernate的新手。在工作中,我们正在使用Spring,Hibernate,JBOSS等开发中型,处理J2EE Web应用程序。使用Hibernate的正确方法是什么?我应该首先创建一个类图和使用hibernate到数据库表的映射,还是应该首先建模数据库表,然后将其映射到Hibernate实体?还是依赖于它?如果它取决于什么?这种方法中的任何一种方法都存在缺点吗?是否可以使用Hibernate 4将“任何”类图映射到数据库?

4 个答案:

答案 0 :(得分:6)

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

  1. 在创建新应用程序(新模型)时,首先要创建实体,然后让hibernate / JPA创建表格。它更简单,可能会生成更好的对象模型(因为您直接创建它)。但是你仍然要记住,你正在创建数据库表,所以你也应该考虑数据库规范化等。
  2. 在映射某些遗留模式时,您将首先使用表格方法,除此之外别无选择。对象模型可能有点笨拙......
  3. 但我再说一遍,这两种方法都是有效的,如果你比DB程序员更像数据库工程师,你可能会做2)因为你可能更自然。我作为一个Java程序员(几乎)总是1)......

    你可以用两种方法得到相同的结果,你必须考虑一下,hibernate将为你生成什么......

答案 1 :(得分:3)

它没有任何区别:要么可以映射到另一个,要么你需要注意两者(ORM阻抗不匹配)。

如果你正在进行绿地开发,IMO,请从类图=>数据库表;在课堂上思考更容易。一般来说,有理的类结构很好地映射到数据库表,但要记住效率(“注意”部分)。

答案 2 :(得分:1)

我认为清楚地识别您的实体及其之间的关系非常重要,因为它们是您在域世界中真正问题的Java世界中的代表。确保您的实体在业务方面具有通讯记录。事实上,这本身就是一个完整的问题,有几种方法(例如DDD)。 一旦明确定义了实体,您还应该考虑应用程序的主要用途。您可以使用hibernate以不同的方式映射它。

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

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

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

不确定这篇文章是否真的是你所需要的 - 至少对于初学者来说,最重要的是从课开始,保持简单(单向)并确保你没有映射到没有业务的东西意思是除非你真的非常必须!

答案 3 :(得分:0)

我不同意其他答案,您应该努力采用数据库模型优先方法一般(尽管在某些特殊情况下,对象模型优先方法更好)。 / p>

很久以前,关系模型已经取代了networked model(OO,图形数据库)和hierarchical model(JSON,XML),即使模型可以技术上可以互相转化。从长远来看,使用数据库供应商的DDL来开发设计良好的标准化模式要容易得多,而不是弄清楚如何从OO模型增量中生成DDL和更新语句。

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

I have blogged about this in more detail here