Hibernate注释与关系中的关联数据的N ---- N关系

时间:2011-12-20 19:24:13

标签: hibernate hibernate-mapping hibernate-annotations

在像这样的简化情况下,有3个类:

class ClassONE{

   protected List<IntermediatedClass>;

   (... getters / setters)

}

class ClassTWO

 protected String someData;

 (... getters / setters / iniciate List etc...)

}

class IntermediatedClass{

 public ClassONE one; //Points to an object (row) of ClassONE
 public ClassTWO two; //Points to an object (row) of classTWO.
 public Double data; //Data that need being saved with this particular relation between obj1 and obj2.

}

我知道使用Hibernate可以声明class1和class2之间的ManyToMany单向关系。 Class1可以包含class2的一些对象,class2可以在class1的某些对象上。那只是[CLASS1] N ---- N [CLASS2]。

我想声明一个[CLASS1] 1 --- N [INTERMEDIATECLASS] N --- 1 [CLASS2]典型的N-N数据库实现。中级类有一个非常重要的属性:data,一个Double类型。我无法找到将IntermediateClass声明为我自己用Hibernate Annotations中的数据实现这个N - N的方法。

请帮忙吗?只需这个简单的例子,我就可以解决我的麻烦。我没有尝试过它,以便保持清洁代码以便理解。

1 个答案:

答案 0 :(得分:2)

您可以使用具有其他属性的中间映射类创建完整的双向多对多映射,方法与设计ER模型的方式相同:

class A {
  private List<AB> ab;

  @OneToMany(mappedBy = "a")
  public List<AB> getAb() {...}
}

class B {
  private List<AB> ab;

  @OneToMany(mappedBy = "b")
  public List<AB> getAb() {...}
}

和映射类:

class AB {
  private A a;
  private B b;
  private double data;

  @ManyToOne
  @JoinColumn
  public A getA() {...}

  @ManyToOne
  @JoinColumn      
  public B getB() {...}

  @Column
  public double getData() {...}
}

但是,由于这样的双向关联可能会在您的应用程序代码中变得相当混乱和难以维护,我会在没有双向关联的情况下完成,只需在AB类中定义两个单向多对一关联。