Отображение наследования в Hibernate - PullRequest
0 голосов
/ 24 января 2012

У меня есть два набора таблиц, унаследованных следующим образом:

Print
|
+-Magazine -+- ScientificMagazine
|           |
|           +- PopularMagazine
|
+-Book -+- EncyclopediaBook 
        |
        +- ReligiousBook 

И соответствующая иерархия локалей:

PrintLocale
|
+-MagazineLocale -+- ScientificMagazineLocale
|                 |
|                 +- PopularMagazineLocale
|
+-BookLocale -+- EncyclopediaBookLocale
              |
              +- ReligiousBookLocale

Я пытаюсь сопоставить классы Prints ссоответствующие Locales.

Обратите внимание, что класс Locale - это перечисление {en, de, fr, es, cs} - сокращений языков.

Так что в классе Print у меня есть EnumMap длясопоставить соответствующие Locales для Print:

public class Print<T> {
    ...
    @ElementCollection
    @JoinTable (joinColumns = @JoinColumn (name="print_id"))
    @MapKeyColumn (name="locale")
    protected Map<Locale, T> locales = new EnumMap<Locale.class>();
    ...

Мои проблемы:

  1. Когда я пытаюсь отобразить унаследованные классы (например, Mapping ScientificMagazineLocale, которые наследуют переменные из егородители в ScientificMagazine), я получаю ArrayOutOfBoundException.Если я копирую все содержимое PrintLocale, MagazineLocale в ScientificMagazineLocale и удаляю наследство, все работает правильно.

  2. Поскольку PrintLocale отображается в классе Print, гиберны всегда пытаются сгенерировать "print_locales"таблица вместо соответствующих таблиц (Popular_magazine_locale, Scientific_magazine_locale, ...), хотя в PopularMagazineLocale я определяю @Table (name =" Popular_magazine_locale ").

Ответы [ 2 ]

0 голосов
/ 25 января 2012

Решением было использование @MappedSuperClass для родительских абстрактных классов.

0 голосов
/ 24 января 2012

Для вашей первой проблемы: @JoinTable (joinColumns = {@JoinColumn (name = "print_id")})

Попробуйте это.

Я предполагаю, что Hibernate ожидает, что "joinColumns" будет массивом. Вот почему вам необходимо добавить эти {} скобки.

Что касается вашей второй проблемы, JPA 2.0 заявляет, что для @Inheritance по умолчанию используется InheritanceType.SINGLE_TABLE. Который используется, если не предоставляется аннотация @Inheritance. В результате все сопоставляется с 1 таблицей.

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