| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java EE (J2EE) и Spring > Hibernate |
| Автор: Tony 1.8.2006, 01:50 | ||
| Привет! Начал учить Hibernate. Столкнулся с проблемой. Имею 2 класса (2 таблицы) и таблицу связи, состоящую из 2 колонок id first class и id second class.Пишу код
Как сделать чтобы в таблице связи были ID первого объекта, а во второй колонке ID второго объекта. Сейчас объекты сохраняются, но в таблице связи не создаётся строка. |
| Автор: tux 1.8.2006, 02:55 | ||||||||||
| Насколько я понял у тебя здесь отношение между классами "многие-ко-многим". Тогда проще всего будет использовать соответствующие конструкции 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 1.8.2006, 08:00 |
| Автор: tux 1.8.2006, 08:11 |
| Автор: Tony 1.8.2006, 21:34 | ||
| Проблема была в маппинге. Но я бе понал идею про:
и по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:46 |
| Как я уже говорил, Hibernate реализует интерфейсы java.util.Set и другие подобные по-своему. Это в общем и понятно, ему там нужно хранить информацию о текущей сессии, об объекте, в котором есть атрибут типа Set. Чтобы получить в атрибутах объекта правильные реализации и правильно настроенные делается session.load() чтобы Hibernate сам построил объект как ему надо для корректной работы. В общем тот способ, который я привел - единственное что удалось придумать для такой задачи. Если у тебя получится короче и изящнее, буду только рад. Если найдешь решение, не забудь код запостить сюда. |
| Автор: Tony 3.8.2006, 09:31 |
| Я хотел спросить по4ему ты делел так save-->load-->save когда можно сразу save. |