![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Tony |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1159 Регистрация: 3.3.2006 Где: Riga Репутация: 6 Всего: 12 |
Привет!
Начал учить Hibernate. Столкнулся с проблемой. Имею 2 класса (2 таблицы) и таблицу связи, состоящую из 2 колонок id first class и id second class.Пишу код
Как сделать чтобы в таблице связи были ID первого объекта, а во второй колонке ID второго объекта. Сейчас объекты сохраняются, но в таблице связи не создаётся строка. Это сообщение отредактировал(а) tux - 1.8.2006, 08:13 |
|||
|
||||
| tux |
|
||||||||||
![]() Летатель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1853 Регистрация: 10.2.2005 Где: msk.ru Репутация: 74 Всего: 132 |
Насколько я понял у тебя здесь отношение между классами "многие-ко-многим". Тогда проще всего будет использовать соответствующие конструкции Hibernate. Предполагаем, что связующая таблица называется book_author и состоит из двух полей - book_id и author_id.
Класс Author:
Класс Book:
Маппинг для класса Author:
Маппинг для класса Book:
Ну и тестовый код:
В результате в таблицу book_author должна добавиться одна запись. Небольшой комментарий. Здесь нужно отметить два момента. Первый - для работы с хранимыми множествами Hibernate использует собственные реализации интерфейсов типа Set, List и т.п. Второй - на протяжении сессии Hibernate хранит все объекты, с которыми выполнялась работа в кэше. Следовательно, для того, чтобы нормально сохранить в базу объекты, помещенные в Set нам нужно там иметь реализации Set от Hibernate. Казалось бы, можно просто сохранить объект (session.save()) и потом получить его у Hibernate (session.load()), но Hibernate в кэше сессии хранит оригинальные объекты и получим обратно тоже самое, что и сохранили, то есть объекты, в которых значения атрибутов books и authors равны null. Чтобы заставить Hibernate перегрузить объекты из базы, удаляем эти объекты из кэша выполнив session.evict(). В остальном думаю должно быть понятно. |
||||||||||
|
|||||||||||
| batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 16 Всего: 151 |
Модератор: Сообщение скрыто. -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
| tux |
|
|||
![]() Летатель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1853 Регистрация: 10.2.2005 Где: msk.ru Репутация: 74 Всего: 132 |
Модератор: Сообщение скрыто. |
|||
|
||||
| Tony |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1159 Регистрация: 3.3.2006 Где: Riga Репутация: 6 Всего: 12 |
Проблема была в маппинге.
Но я бе понал идею про:
и по4ему нельзя без book = (Book) session.load(Book.class, bookId); author = (Author) session.load(Author.class, authorId); book.getAuthors().add(author); ? если можно сразу при сайве session.save(); Тоесть приходится делать save zatem load potom opat save dlja dobavlenja book.getAuthors().add(author); ? Это сообщение отредактировал(а) tux - 2.8.2006, 01:39 |
|||
|
||||
| tux |
|
|||
![]() Летатель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1853 Регистрация: 10.2.2005 Где: msk.ru Репутация: 74 Всего: 132 |
Как я уже говорил, Hibernate реализует интерфейсы java.util.Set и другие подобные по-своему. Это в общем и понятно, ему там нужно хранить информацию о текущей сессии, об объекте, в котором есть атрибут типа Set. Чтобы получить в атрибутах объекта правильные реализации и правильно настроенные делается session.load() чтобы Hibernate сам построил объект как ему надо для корректной работы.
В общем тот способ, который я привел - единственное что удалось придумать для такой задачи. Если у тебя получится короче и изящнее, буду только рад. Если найдешь решение, не забудь код запостить сюда. |
|||
|
||||
| Tony |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1159 Регистрация: 3.3.2006 Где: Riga Репутация: 6 Всего: 12 |
Я хотел спросить по4ему ты делел так save-->load-->save когда можно сразу save.
|
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |