【问题标题】:Hibernate: Multiple FK relationshipsHibernate:多个 FK 关系
【发布时间】:2010-11-30 15:12:26
【问题描述】:

我在定义 Hibernate 实体时有点卡住了:

假设我在数据库中有以下两个表:

(A)

  • 来自公司
  • 到公司
  • 通过公司

(B)

  • 公司 ID (PK)
  • 说明

其中(A)的元素指向(B)的主键;所以FK和PK之间有3个一对一的关系。 我假设 3 个具有不同 mappedBy 条件的 OneToOne 语句不是要走的路,嗯?漫长的一天——我可能只是不明白;)

感谢您的帮助!

【问题讨论】:

  • 这绝对是 OneToOne 而不是 ManyToOne?如果表 A 是一个装运表,那么表 B 中的公司可以只运送一件物品吗?

标签: java hibernate


【解决方案1】:

如果我理解正确,您希望您的数据库如下所示:

tableA
- id
- fromCompanyId (references tableB.id)
- toCompanyId (references tableB.id)
- viaCompanyId (references tableB.id)

tableB
- id
- description

如果是这样,你当然可以拥有这个。您只需要覆盖关系的默认列名,以便每个关联都有自己的列名,而不是回退到默认名称,这会使三个关联具有相同的名称,从而导致问题。

我不太同意 OneToOne,但我认为这是一个有意识的决定。

看到这个: http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/entity.html#entity-mapping-association

【讨论】:

  • 非常感谢大家 - 现在睡了几个小时后,我恢复了思考的能力;)并为打扰您感到有点抱歉。
  • 表结构确实如你所想。是的,一对一关系的想法来自应用场景。尽管有机会,例如使用相同的 ID。 fromCompany 和 viaCompany,我倾向于将它们视为两个语义不同的对象,因为公司本身在每个数据字段中扮演着不同的角色……很难描述而没有解释整个事情。但你肯定是对的,一般来说一对多关系可能是更好的方式。
【解决方案2】:

您当然可以通过一对一的关系做到这一点。您的 A 类中将包含三个 Company 对象,以及适当的映射。

如果我们能看到代码和休眠映射会有所帮助。

【讨论】:

    【解决方案3】:

    用 3 个指向 ClassB 的多对一关系实现 Class A 的最简单方法

    @Entity
    class ClassA {
    
        //@ID
        //private id;
    
        @ManyToOne
        private ClassB from;
    
        @ManyToOne
        private ClassB toCompany;
    
        @ManyToOne
        private ClassB viaCompany;
    }
    

    行不通,因为每个实体都需要一个 ID。 – 您可以尝试通过使用组合 ID(由三个关联组成)来解决此问题,但我想实现由与其他实体的关联组成的 ID 会带来很多麻烦。

    @见Hibernate/persistence without @Id

    Hibernate 提供的另一种方式是所谓的三元关联。 – 在这种情况下,您以三元 m:n 关系的形式对完整的表 A 进行建模。 – 但这也是一项非常复杂的任务。

    @见http://docs.jboss.org/hibernate/core/3.5/reference/en/html/collections.html#collections-ternary

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-07
      • 2016-08-30
      • 1970-01-01
      • 2018-10-16
      • 1970-01-01
      • 2011-03-15
      • 2015-10-24
      • 1970-01-01
      相关资源
      最近更新 更多