2010-04-14 7 views
1

У меня есть класс Player, который содержит список Accessory объектов. Есть два вида аксессуаров. В SocketedAccessories есть список SocketJewels, а у MagicAccessories есть список MagicEnchantments.Hibernate collection несколько типов

На уровне базы данных есть таблица players, которая представляет плеер, и таблицу accessories, которая содержит список аксессуаров. Принадлежности имеют поле типа, которое указывает, являются ли они сокетными или магическими, а столбцы, которые используются только одним типом, просто оставлены пустыми для записей другого типа. Есть socket_jewels и magic_enchantments столы, представляющие драгоценности сокета или волшебные заклинания на каждом аксессуаре.

Я пытаюсь выяснить правильный способ сопоставить это с Hibernate. Один из способов был бы для игрока иметь два списка аксессуаров: один для SocketedAccessories и один для MagicAccessories. Это кажется нежелательным. Я хочу, чтобы указать, что у игрока должно быть поле List<Accessory> accessories, которое содержит оба типа вещей.

Есть ли способ сообщить Hibernate, либо в hbm.xml, либо в аннотации, чтобы сделать это?

ответ

2

Есть ли способ сообщить Hibernate, либо в hbm.xml, либо в аннотации, чтобы сделать это?

Что вы описываете как выглядит одиночной таблицы в иерархии классов стратегии (всех свойства всех супер- и подклассов отображенных в ту же таблицу, экземпляры отличаются особым дискриминатором колонкой).

Вы можете сопоставить это с annotations и/или xml mappings (и есть один List, Hibernate поддерживает полиморфные запросы, т.е. вы можете запросить на Accessory суперкласса и получить список подклассов).

Обновление: Если аксессуар является интерфейсом, взгляните на this previous answer.

+0

Это хорошая новость! Хотя, похоже, что «Аксессуар» должен быть базовым классом, а не интерфейсом, если я хочу иметь список из них? –

+0

@CaptainAwesomePants Аксессуар может быть интерфейсом. Но вам, возможно, придется использовать hbm. В документации на гибернативный ядро ​​прямо указано, что вы можете использовать интерфейсы. Я добавлю ссылку на другой ответ, охватывающий случай интерфейсов с JPA. –

+0

А, я вижу, я пропустил тот факт, что Payment был интерфейсом (а также пропустил бит «аннотирование интерфейсов в данный момент не поддерживается»). Спасибо! –

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