如何在Hibernate中映射这种关系?

时间:2010-07-20 07:43:53

标签: java database hibernate mapping

我有两张桌子:

Dataid,以及许多字段。其中一些字段是引用下一个表格中多语言值的“代码”,例如country_codecontinent_code

包含多语言代码的表格Thesaurus,其中包含以下列:codecode_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 个答案:

答案 0 :(得分: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和语言列定义为唯一。

有关更多信息,请参阅hibernate“映射继承”部分here