| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java EE (J2EE) и Spring > Hibernate. Связь many-to-many |
| Автор: Shaggie 27.6.2007, 13:56 | ||||||||
Существует БД:
Связь между таблицами cd и style осуществляется по принципу many-to-many, для чего существует сводная таблица cd_style. Маппинг таблицы style:
Маппинг таблицы cd:
Всё работает, в программе после вызова Cd.getStyles() генерится собственный сет объектов Style. Это нормально. Но неэффективно с точки зрения логики программы. Гораздо правильнее было бы использовать коллекцию TreeMap. Но я не могу написать маппинг! Кто-нибудь сталкивался с необходимостью создавать мап объектов? В моём примере ключом, по идее, должен оказаться INT PRIMARY KEY таблицы style, а значением - соответствующий объект Style. Возможные варианты:
Уже голова пухнет, но ответа так и не нашёл. Если можете - помогите, пожалуйста! |
| Автор: Shaggie 4.7.2007, 12:15 | ||||
| Спасибо powerOn, который запостил в одном из обсуждений ссылку на http://www.java2s.com. Там я нашёл вариант решения проблемы, но он меня не очень устроил. Как вы могли заметить, в элементе Map должно быть ещё три элемента, причём у каждого необходимо указать колонку из таблицы, с которой делается маппинг. То есть в промежуточной таблице должно быть ТРИ колонки! С одной стороны, это непорядок. С другой, тогда всё действительно работает. В результате промежуточная таблица в базе выглядит так:
а мап маппинга (извините... слова почти одинаковые, а понятия разные) таблицы cd так:
Необходимые пояснения. Число cd_id - это тот объект Cd, у которого будет свой мап объектов Style. Число st_key - это объект типа Integer, который будет ключом (key) к для каждого Style в мапе. Число st_id - это указатель на тот объект Style, который будет значением (value) в мапе. Теперь после вызова Cd.getStyles() генерится собственный мап объектов Style, и это есть как раз то, что мне было нужно. НО! Появляются определённые издержки. Теперь запрос SELECT * FROM cd_style; вернёт такое вот чудо: cd_id | st_key | st_id ------------------------ 1 | 1 | 1 1 | 3 | 3 2 | 1 | 1 2 | 6 | 6 2 | 7 | 7 В результате таблица распухает на треть безо всякой пользы для цивилизации. Налицо подгон базы под hibernate, а ведь по идее он должен работать с тем, что дают, и уж тем более не ломать нормализацию... Однако повторюсь, что сохранять зависимость many-to-many наиболее эффективно всё-таки в мапе. Поэтому тема остаётся открытой. Есть ли способы замапить связь, используя только ДВЕ колонки в промежуточной таблице? |