2011-11-26 82 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(許多)