2010-07-20 50 views
1

我有2個表格:如何在Hibernate中映射這種關係?

表格Dataid,加上很多字段。這些字段中的某些字段是引用來自下一個表的多語言值的「代碼」,例如country_code,continent_code

其中包含多語言碼,與列中的表Thesauruscodecode_typelanguagetext。代碼對於一個code_type是唯一的,但可能會有多次使用不同'code_type'值的相同代碼。從該表

實施例的數據:

code code_type language text 
---------------------------------------------------- 
USA  CNT   EN   United States 
USA  CNT   FR   Etats-Unis 
FR  CNT   EN   France 
FR  CNT   FR   France 
FR  LNG   EN   French 
FR  LNG   FR   Français 

所以數據表的country_code列可能包含'FR''US',並且language code列可能包含'FR'爲好。暗含的是,country_code列包含國家代碼'CNT',而language_code列包含語言類型「LNG」的代碼。

我怎樣才能在Hibernate中映射,這樣我可以在我的Java代碼中做這樣的事情: (假設該應用程序的當前區域設置爲美國英語)

myData.getCountryCode(currentLocale.getlanguage()); --> returns 'France' 
myData.getLanguageCode(currentLocale.getlanguage()); --> returns 'French' 

請注意,我不能修改數據庫模式,我沒有設計自己!

回答

1

對於國家代碼和語言代碼(包含字段代碼,語言和文本),您可以在Data類中擁有兩個不同POJO的列表,這兩個POJO實現相同的抽象類。要映射它們,您可以使用「單一表策略」的「繼承映射」,並將code_type列定義爲鑑別器列。

@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
    @DiscriminatorColumn(name = "code_type", discriminatorType = DiscriminatorType.STRING) 

然後,您可以查詢語言代碼或國家代碼如下

myData.getCountryCode(currentLocale.getlanguage()).getText(); --> returns 'France' 
    myData.getLanguageCode(currentLocale.getlanguage()).getText(); --> returns 'French' 

而且你可以定義代碼,code_type和語言列作爲唯一的。

欲瞭解更多信息,請參閱休眠「映射繼承」部分here

+0

感謝您的回答。我得到了抽象類+繼承映射位。這似乎是一個好主意。 但是,您如何建議我映射數據實體端的關係?作爲使用language_code列作爲JoinColumn的一對多?我如何最終得到一個包含不同語言實體的地圖,並將語言代碼作爲關鍵字,就像我們的例子一樣? – 2010-07-20 15:17:05

+0

好的,我明白了:我使用Map 作爲關係,並且使用@MapKey註釋來指定語言應該是Map中的鍵。 – 2010-07-20 16:54:28