| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java EE (J2EE) и Spring > Hibernate проблемы с кешем |
| Автор: pnd_ku 30.3.2009, 16:41 | ||||
| Всем добрый вечер! Суть проблемы следующая: есть 2 POJO объекта и с соотношением один-ко-многим.. процесс такой: 1)извлекается набор родителей 2)потом к одному из родителей добавляется детёныш ( 3)заново извлекаеца набор родителей.. в этом наборе, при запросе детёнышей у конкретного родителя к которому добавляли, новый не появляется мои подозрения падают на кеш и на флаш сессии.. но флаш отрабатывает нармально, то есть после добавления детёныша в набор он сразу же отображаеца в базе собственно маппинги: родитель
детёныш
куда хоть копнуть? спасиба! |
| Автор: pnd_ku 30.3.2009, 17:10 | ||
| Уфф.. обнаружил проблему.. теперь интересно услышать объяснение от опытных - как так получилось вот тест кейз:
Всё решилось добавлением вот этих двух строк currentSlot.getBookings().add(booking); MainDAO.getAvailableSlotsDAO().save(currentSlot); Нет, ну понятно что новый заказ для слоиа нужно сохранить. Но зачем его ручками добавлять в коллекцию этому слоту? Слоты извлекаюца второй раз заново, как указать Hibernat`у что нужно заново извлечь и заказы? |
| Автор: MisterCleric 31.3.2009, 09:14 | ||||||
| Здравствуй. Я скажу такое: это издержки Object Relation Mapping. Это в базе все просто: сказали в Bookings форинг кей на AvailableSlots и механизмами реляционности новые записи становятся известны. JAVA - это же не данные, а только объекты. Так что если надо что бы один объект знал о другом, то ему насильно надо об этом сообщить. От сюда делаем разбор твоего размышления
Вроде как бы все правильно. Но тут я уверен, что все эти операции производились в рамках одной Session. Т.е. первый раз набор родителей извлекался все-таки из базы. Операция инсерта тоже пошла в базу. Ну а вот последняя операция не пошла в базу. Так как сработал "кеш первого уровня"
Нужно lazy="false", если вдруг ты закроешь Session, а потом тебе понадобится коллекция bookings. Т.е. доставать коллекцию "детеныешей" насильно.
можно было и без добавления в коллекцию. Можно вызвать на currentSlot refresh - тогда в базу пойдет насильный запрос. Можно и без refresh и без добавления в коллекцию. но тогда операции инсерта и дальнейшего обновления currentSlot надо делать в разных Session. Вроде все. |
| Автор: pnd_ku 31.3.2009, 21:24 | ||||||
Первая - да, вторая тоже в базу, третья - из базы извлекались слоты, а дочерние букинги за ними не тянулись а брались из кеша. С одной стороны понятно зачем - для улучшения производительности, с другой - всё таки странно.
Это правда, но бывают ситуации когда мне нужна коллекция кучи слотов, но без букингов. А если поставить фолс, то ещё и тянеца огромная куча букингов автоматически. Но это уже да - специфика приложения.
Вот это классно! спасиба, не подозревал Вообще огромадное спасиба за такой развёрнутый ответ! Мне очень помогло, и надеюсь ещё камунить поможет |