2011-11-26 57 views
0

我有2个测试类:如何实现在JPA这个简单的关联/休眠

Class A{ 
    B b; 
    // some other properties 
} 

Class B{ 
    // some properties 
} 

A的每个实例有B类只有一个实例,但B类的实例可以被分配到超过类的一个实例的

,如:

B b = new B(); 
A a1 = new A(); 

a1.setB(b); 

A a2 = new A(); 
a2.setB(b); 

哪种类型的关联是什么?
起初我在想一个一对一的单向,但也许是多对一?但我没有B上任何A对象的集合。

有人能解释我是什么才能实现这种关联(使用注释)?

+0

它从A的一面是多对一的。 –

回答

5

A的每一个实例都具有B类的仅一个实例,但实例 B类可以分配给A类的多个实例

所以,A到B是多对一的关系。 B到A是一对多的关系。

以下显示A和B使用注释之间的双向映射:

@Entity 
@Table(name="tableA") 
Class A{ 

    @ManyToOne 
    @JoinColumn(name = "B_ID") 
    B b; 

    // some other properties 

} 

@Entity 
@Table(name="tableB") 
Class B{ 

    @OneToMany(mappedBy = "b") 
    List Set<A> listOfA= new ArrayList<A>(); 

    // some other properties 
} 

要点:

  • @Entity标志着java类作为休眠实体。它映射到指定了在@Table

  • 如果没有@Table指定的表的名称,默认情况下,它被映射到表等于实体的非限定类名称的名称。

  • @ManyToOne定义A类B类的关系是许多对一

  • 在关系数据库中,一对多的关系,通过使用下面的外键约束来表示:

    “许多边桌”有一个只接受“一边桌”PK的FK栏。

    此FK列的名称可以通过@JoinColumnname属性明确定义。如果没有指定@JoinColumn,那么用于此FK列的默认值将与“单边表”的名称,_(下划线)以及“单边表”中PK的名称连接, 。

  • @OneToMany定义B类与A类的关系是一对多关系。

+0

我不明白的是:我需要B班的listOfA吗?在我的例子中,它不存在,我不得不将它添加到B类,或者我可以用@ManyToOne在A上注释B b,并且在B上没有A的集合? – res1

+1

我只是演示A和B之间的*双向*映射。它表示给定A,您可以访问B.给定B,你可以访问A.如果你在B中省略了@ @ OneToMany,那么它们的关系被映射为*单向*。当然,它也会起作用!但是,考虑到B,你不能访问A. –

1

的关系为:

B(一)---到 - > A(许多)