2013-12-13 50 views
2

好的,所以今天我嘗試了一個基本的Hibernate教程,並且努力使其表現得如何。沒有第三張表的一對多關聯

這是一個簡單片斷,假設所有其它字段/方法被定義(例如ID等)

@Entity 
@Table(name = "CITIES") 
public static class City { 

    @ManyToOne 
    @OnDelete(action = OnDeleteAction.CASCADE) 
    private Country country; 


} 


@Entity 
@Table(name = "COUNTRIES") 
public static class Country { 

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    private Set<City> cities; 
} 

將上述溶液利用了(自動創建的)關聯表 - COUNTRY_CITIES,但 這樣做工作只有一種方式 - 即我看到國家的城市(當我選擇一個城市時),但我沒有看到一個城市的國家(當我選擇一個城市時)。

那麼,我應該怎麼做才能讓城市看到他們的國家?

我可以將添加到Country.cities字段,它有兩種工作方式。

但我不喜歡從國家的代碼添加列到城市的表。

因此,我將@JoinColumn添加到City.country字段,它不起作用。

所以 - 如何使關聯工作在沒有關聯表的兩種方式?


行,更確切地說:我使用上述代碼添加與該對象喂DB:

Country germany = new Country("Germany", new HashSet<>(asList(
      new City("Berlin"), 
      new City("Hamburg") 
    ))); 

..和觀看的DB。它是這樣的:

表COUNTRIES_CITIES(注意,我並沒有把它聲明;休眠自動執行)

COUNTRIES_ID CITIES_ID 
1    1 
1    2 

表COUNTRIES

ID  NAME 
1  Germany 

表城市(注意我沒有申報COUNTRY_ID列!再次休眠..)

ID NAME  COUNTRY_ID 
1 Berlin null 
2 Hamburg null 

就是這樣。提取國家給我的城市,提取城市給我空的國家。


如果我添加一個@JoinColumnCountry類,則列追加到CITIES表和工程取兩種方式。

+0

嘿,您提供的類定義沒有意義。國家和城市的內部班級是外部班級嗎?您的類聲明具有靜態標識符,這在外部類聲明中是非法的。 – SpartanElite

+0

@SpartanElite是的,他們都嵌套在一個'公共類Example1 {..}'只是爲了保持在一個地方 – Parobay

+0

我甚至不會看你的問題的內容,答案或評論。爲什麼沒有第三張桌子的一對多關係會成爲問題?很多很多,當然;一對多 - 那麼你或者其他人(框架作者?)做錯了 –

回答

3

閱讀你的編輯問題之後是顯而易見的。

您添加城市和與國家關聯的方式...

Country germany = new Country("Germany", new HashSet<>(asList(
     new City("Berlin"), 
     new City("Hamburg") 
))); 

如果你這樣做,那麼城市沒有一個國家。沒有你設置城市的鄉村財產。即。 city.country = germany;
雙向關係你不能依靠JPA或你的提供者完全管理你的對象持久化。

那麼這就是你需要做什麼..

Country germany = new Country("Germany"); 
City berlin = new City("Berlin"); 
City Hamburg = new City("Hamburg"); 
berlin.country = germany; 
hamburg.country = germany; 
germany.cities = new HashSet<>(asList(berlin, hamburg)); 
germany.saveOrUpdate(); // or whichever definition you use 

現在在DB你的城市表將有正確的國家標識。 此外,還建議您使用屬性中的mappedBy屬性,因爲這是雙向關係。使用它你告訴JPA城市是Country 1-n City關係的反面。

+0

是的,情況就是如此。非常感謝,現在我明白了這個問題。行爲雖然不完全直觀,但:) – Parobay

2

您是否嘗試過使用mappedBy屬性?

@OneToMany(mappedBy="country", cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
private Set<City> cities; 

有關說明,請看這裏:Can someone please explain mappedBy in hibernate?

+0

只是簡單地加入這個只會讓事情變得更糟,現在我看不到國家和城市都不在城市 – Parobay

+0

奇怪的是,在stackoverflow中搜索也表明這種方法:http://stackoverflow.com/questions/6649032/avoid-relation-table-in-hibernates-mapping-one-to-manyor-one-to-many-associat – Ben

+0

nope,沒有幫助...看來我的例子的工作方式與預期相反! – Parobay