2010-07-20 3 views
1

У меня есть 2 стола:Как сопоставить эти отношения в Hibernate?

Таблица 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» для языка.

Как я могу отобразить это в спящем режиме, так что я могу сделать что-то подобное в моей Java-коде: (давайте предположим, текущую локаль приложения является американским английским)

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

Обратите внимание, что я не могу модифицировать схему БД, которую я сам не проектировал!

ответ

1

В вашем классе данных вы можете иметь список двух разных 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 Inheritance» here

+0

Спасибо за ответ. Я получаю бит абстрактного класса + наследования. Это кажется хорошей идеей. Однако, как вы предлагаете мне сопоставить отношения на стороне объекта Data? как один-ко-многим, используя столбец language_code как JoinColumn? Как мне получить карту, содержащую сущности для разных языков, с кодом языка в качестве ключа, как в нашем примере? –

+0

ОК, я понял: я использую Map для отношения, и я использую аннотацию @MapKey, чтобы указать, что язык должен быть ключом на Карте. –

Смежные вопросы