Как отобразить эти отношения в Hibernate? - PullRequest
1 голос
/ 20 июля 2010

У меня есть 2 таблицы:

Таблица 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'

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

1 Ответ

1 голос
/ 20 июля 2010

Вы можете иметь список двух разных POJO, которые реализуют один и тот же абстрактный класс, в вашем классе данных как для кода страны, так и для кода языка (с полями code, language и text). Чтобы отобразить их, вы можете использовать «отображение наследования» со стратегией одной таблицы и определить столбец 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, code_type и language как уникальные.

Для получения дополнительной информации см. Раздел «Отображение наследования» в спящем режиме здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...