2011-12-09 137 views
2

我有以下表:休眠連接表限制

[表:列1,列2]

答:ID,名稱

B:ID,名稱

AB:IDA, idB

AB是一個連接表。

然後我對休眠B類

@OneToMany(fetch = FetchType.EAGER) 
@JoinTable(name = "AB", 
      joinColumns = @JoinColumn(name = "idB"), 
      inverseJoinColumns = @JoinColumn(name = "idA")) 
public List<A> getAs(){ 
    //return the list of matching stuff 
} 

這工作完全正常此方法。

現在我想在Hibernate中做到這一點。SQL查詢:

select * from B inner join AB on B.id = AB.idB where AB.idA = 1234 

從本質上講,「列出了我所有的B的引用一個ID爲1234」

我可以做直接的SQL,但是這不符合getAs()的用途

是否可以構造一個Criterion/Restriction子句來實現這一點?

回答

1

在這種情況下,AB之間的關係不是一對多關係,而是多對多關係。你應該把它映射爲這樣:

@ManyToMany 
@JoinTable(name = "AB", 
      joinColumns = @JoinColumn(name = "idB"), 
      inverseJoinColumns = @JoinColumn(name = "idA")) 
public List<A> getAs(){ 
    //return the list of matching stuff 
} 

注意,急切地取出一個集合不是在大多數情況下是一個好主意,因此fetch = FetchType.EAGER上方拆下。現在,您可以做A側相同,使關係雙向的:

@ManyToMany(mappedBy='As') 
public List<B> getBs(){ 
    //return the list of matching stuff 
} 

現在讓所有B S代表給A僅僅是一個呼籲對A實例getBs()的問題。您可以創建標準/編寫HQL來做到這一點 - 從任何一方。

+0

是有意義的。順便說一句,如果我離開fetch = FetchType.EAGER,會發生什麼? –

+0

@Ken Eager fetch意味着當你嘗試獲取你的'B'時,Hibernate會嘗試檢索所有相關的'A's。如果'A'也具有其渴望獲取映射的'B'集合,則同樣適用,等等。將所有提取設置爲渴望可能很容易導致您每次獲取單個實體時都會檢索整個數據庫。 – ChssPly76

+0

默認情況下,集合屬性被視爲「LAZY」,這是由JPA規範規定的。 –