2010-11-30 133 views
0

我有点卡住定义一个Hibernate实体:休眠:多FK关系

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

(A)

  • fromCompany
  • toCompany
  • viaCompany

(B)

  • companyID(PK)
  • 描述

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

感谢您的帮助!

+1

这是绝对OneToOne,而不是多对一?如果表A是可以说发货表,那么表B中的一家公司只发货一件? – Qwerky 2010-11-30 15:40:20

回答

0

如果我理解正确的话,你希望你的数据库是这样的:

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

+0

非常感谢你 - 现在睡了几个小时后,我重新思考了自己的能力;)并且感到有些懊恼你。 – henning 2010-12-01 10:06:06

0

你当然可以用一对一的关系做到这一点。你将在你的A类中有三个公司对象和适当的映射。

如果我们能看到代码和hibernate映射,这将有所帮助。

0

实现带3间多对一的关系类指着ClassB的

@Entity 
class ClassA { 

    //@ID 
    //private id; 

    @ManyToOne 
    private ClassB from; 

    @ManyToOne 
    private ClassB toCompany; 

    @ManyToOne 
    private ClassB viaCompany; 
} 

是行不通的,因为每一个实体需要一个ID最简单的方式。 - 您可以尝试通过使用组合ID(由三个关联组成)来克服这个问题,但是我想这会导致很多麻烦来实现由与其他实体关联组成的ID。

@see Hibernate/persistence without @Id

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

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