【问题标题】:Hibernate mapping休眠映射
【发布时间】:2012-04-04 16:21:35
【问题描述】:

我需要帮助来为我的项目中的一组表/类建模。我还需要有关如何为这些表进行休眠映射的帮助。我的项目中有以下表格。

  1. 组织结构
  2. 联系方式
  3. 地址

Person 表可以有一个或多个地址。组织和联系人只能有一个地址。所以我添加了以下列来建立表之间的关系。

地址表有 PersonId [因为一个人可以有多个地址]。

Organization and Contact 表有 AddressId [因为这些表只能有一个地址]。

  1. 我想知道我需要为这些表创建哪些 java 类。目前我有 Person、Address、Organization 和 Contact 类。不确定如何将 Address 类链接到 Person、Organization 和 Contact 类。
  2. 我想知道我应该将地址视为组件还是实体。以及如何创建xml映射地址被视为一个组件。
  3. Address 表中的 PersonId 可能具有为组织和联系人创建的地址记录的空值。我可以创建一个单独的表 [say Person_Address] 来存储一个人的地址列表。但是拥有这个链接表可能会提供 Person 和 Address 表之间的多对多关系。在这种情况下,我如何强制执行一对多关系。

【问题讨论】:

  • 好的。那么到目前为止,您尝试了什么?

标签: java hibernate mapping


【解决方案1】:

我会按照你在 3 中的建议去做。 通过在 Person 类中的地址集上使用 OneToMany 关系,中间表将自动创建,我猜它会对地址 id 有唯一约束。

编辑:如果您在地址类中添加相应的多对一注释并使用并将一对多注释映射到该字段,则只会在地址表中获得引用。但是,由于您不这样做,因此即使具有一对多关系,您也会得到一个 Person_Address 表,而无需创建任何额外的类。

您应该像在普通 java 中那样为您的类建模。即 Person 将有一组地址,其他人将只有一个地址,并且 Address 类忽略了其他人。

然后在 Person 类中添加 @OneToMany 注解,在其他类中添加 @OneToOne 类。或者你把它放在你的 orm.xml 中,尽管注释更便于维护。

至于 Component/Embedable vs Entity,我建议使用 entity,因为它是最简单且没有限制的。不要一下子适应很多概念,坚持主路。

【讨论】:

  • 一个表引用其他有时为空的表通常是不好的形式。我支持 Barsju 的回答,因为 Hibernate 可以处理一对多关系的限制。也就是说,多对多关系很可能不会成为问题。如果两个组织有相同的地址,这些对象不应该指向同一个实体吗?
  • @NathanielFord:我认为您的示例是一个例外情况,而在这种情况下地址重复。如果其中一个组织搬家怎么办。您将冒险更改他们两个的地址。这通常是我会全部使用 Cascade 的领域,它不适用于多对多。使用多对多,您将获得很多不必要的开销..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-27
  • 2011-06-11
  • 2014-12-27
  • 2021-02-02
相关资源
最近更新 更多