Отображение наследования в спящем режиме

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

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

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

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

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

Обратите внимание, что класс 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>();
 ...
</locale.class></locale,></t>

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

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

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

2 ответа

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


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

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

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

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

licensed under cc by-sa 3.0 with attribution.