我有两张桌子:
表Data
:id
,以及许多字段。其中一些字段是引用下一个表格中多语言值的“代码”,例如country_code
,continent_code
。
包含多语言代码的表格Thesaurus
,其中包含以下列:code
,code_type
,language
,text
。代码对于一个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'
请注意,我无法修改我自己没有设计的数据库架构!
答案 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