![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| pnd_ku |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 25.9.2006 Репутация: нет Всего: 1 |
Всем добрый вечер!
Суть проблемы следующая: есть 2 POJO объекта и с соотношением один-ко-многим.. процесс такой: 1)извлекается набор родителей 2)потом к одному из родителей добавляется детёныш ( 3)заново извлекаеца набор родителей.. в этом наборе, при запросе детёнышей у конкретного родителя к которому добавляли, новый не появляется мои подозрения падают на кеш и на флаш сессии.. но флаш отрабатывает нармально, то есть после добавления детёныша в набор он сразу же отображаеца в базе собственно маппинги: родитель
детёныш
куда хоть копнуть? спасиба! |
||||
|
|||||
| pnd_ku |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 25.9.2006 Репутация: нет Всего: 1 |
Уфф.. обнаружил проблему..
теперь интересно услышать объяснение от опытных - как так получилось вот тест кейз:
Всё решилось добавлением вот этих двух строк currentSlot.getBookings().add(booking); MainDAO.getAvailableSlotsDAO().save(currentSlot); Нет, ну понятно что новый заказ для слоиа нужно сохранить. Но зачем его ручками добавлять в коллекцию этому слоту? Слоты извлекаюца второй раз заново, как указать Hibernat`у что нужно заново извлечь и заказы? |
|||
|
||||
| MisterCleric |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1043 Регистрация: 16.2.2006 Где: Харьков, Украина Репутация: 33 Всего: 38 |
Здравствуй. Я скажу такое:
это издержки Object Relation Mapping. Это в базе все просто: сказали в Bookings форинг кей на AvailableSlots и механизмами реляционности новые записи становятся известны. JAVA - это же не данные, а только объекты. Так что если надо что бы один объект знал о другом, то ему насильно надо об этом сообщить. От сюда делаем разбор твоего размышления
Вроде как бы все правильно. Но тут я уверен, что все эти операции производились в рамках одной Session. Т.е. первый раз набор родителей извлекался все-таки из базы. Операция инсерта тоже пошла в базу. Ну а вот последняя операция не пошла в базу. Так как сработал "кеш первого уровня"
Нужно lazy="false", если вдруг ты закроешь Session, а потом тебе понадобится коллекция bookings. Т.е. доставать коллекцию "детеныешей" насильно.
можно было и без добавления в коллекцию. Можно вызвать на currentSlot refresh - тогда в базу пойдет насильный запрос. Можно и без refresh и без добавления в коллекцию. но тогда операции инсерта и дальнейшего обновления currentSlot надо делать в разных Session. Вроде все. -------------------- ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ... |
||||||
|
|||||||
| pnd_ku |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 25.9.2006 Репутация: нет Всего: 1 |
Первая - да, вторая тоже в базу, третья - из базы извлекались слоты, а дочерние букинги за ними не тянулись а брались из кеша. С одной стороны понятно зачем - для улучшения производительности, с другой - всё таки странно.
Это правда, но бывают ситуации когда мне нужна коллекция кучи слотов, но без букингов. А если поставить фолс, то ещё и тянеца огромная куча букингов автоматически. Но это уже да - специфика приложения.
Вот это классно! спасиба, не подозревал Вообще огромадное спасиба за такой развёрнутый ответ! Мне очень помогло, и надеюсь ещё камунить поможет Это сообщение отредактировал(а) pnd_ku - 31.3.2009, 21:26 |
||||||
|
|||||||
![]()
|
| Правила форума "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. |