Я могу придумать пару способов сделать это.
1. Создайте представления для информации о коллекции, которая имитирует нормализованную структуру таблицы, и сопоставьте ее с Hibernate как коллекцию:
Предполагая, что ваша существующая таблица называется primaryentity
, я бы создал представление, похожее на следующее:
-- untested SQL...
create view childentity as
(select primaryentity_id, c1 from primaryentity union
select primaryentity_id, c2 from primaryentity union
select primaryentity_id, c3 from primaryentity union
--...
select primaryentity_id, c100 from primaryentity)
Теперь, с точки зрения Hibernate, childentity
- это просто нормализованная таблица с внешним ключом, равным primarykey
. Отображение этого должно быть довольно простым и рассматривается здесь:
Преимущества этого подхода:
- С точки зрения Hibernate, таблицы нормализованы, это довольно простое отображение
- Нет обновлений в существующих таблицах
Недостатки:
- Данные только для чтения, я не думаю, что ваше представление может быть определено с возможностью обновления (я могу ошибаться)
- Требуется внести изменения в базу данных, может потребоваться создать множество представлений
В качестве альтернативы, если ваш администратор базы данных даже не позволит вам добавить представление в базу данных или вам нужно выполнить обновления:
2. Используйте средство динамического отображения модели Hibernate , чтобы сопоставить ваши свойства C1, C2, C3 с Map , и получить некоторый код, который ваш слой DAO делает в соответствующем диалоге между свойство Карта и Коллекция:
Я никогда не делал этого сам, но я верю, что Hibernate позволяет вам отображать таблицы в HashMaps. Я не уверен, насколько динамически Hibernate позволяет вам это делать (т. Е. Можете ли вы просто указать имя таблицы и иметь Hibernate, автоматически отображающий все столбцы?), Но я думаю, что это еще один способ.
Однако, если придерживаться этого подхода, обязательно используйте шаблон объекта доступа к данным и убедитесь, что внутренняя реализация (использование HashMaps) скрыта от клиентского кода. Также не забудьте проверить перед записью в базу данных, что размер вашей коллекции не превышает количество доступных столбцов.
Преимущества этого подхода:
- Нет изменений в базе данных вообще
- Данные обновляются
- Отображение O / R относительно просто
Недостатки:
- Много слесарного дела в слое DAO для отображения соответствующих типов
- Используются экспериментальные функции Hibernate, которые могут измениться в будущем