Фотография
Про монахов и высокоуровневые абстракции
. . Фильтр OpenSessionInViewFilter из энтерпрайзного фреймворка Spring очень странно себя ведет при совместном использовании с паттерном DAO над Hibernate объектами - не обращает внимания на прописанные параметры @Transactional у классов вида EntityService, считает, что транзакция метода всегда должна быть только "readOnly" и, как следствие, при попытке сохранения подотчетных EntityService объектов в базу валится с эксепшном: "org. springframework. dao. InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode. MANUAL): Turn your Session into FlushMode. COMMIT/AUTO or remove 'readOnly' marker from transaction definition" "Включив" же сессию в запрашиваемый режим - COMMIT/AUTO фильтр вроде бы что-то делает, но реально данные в базу попадают только при следующем реквесте текущего сервлета. Все правильно, сессия-то одна на весь реквест - для того и паттерн, а, согласно коду OpenSessionInViewFilter. java, сессия принудительно сбрасывает данные только при своем закрытии. А закрывается она в конце жизни сервлета, то есть новые данные показываются уже только новой сессией. Можно еще прописать фильтру параметр "singleSession=false", но тогда и так закапсулированная от разработчика методика работы с сессиями становится совсем магической - в процессе работы сервлета фильтр-таки открывает как минимум две сессии, а то и больше, причем, когда именно - непонятно. Данные-то теперь сохраняются сразу, но зато теперь фильтр валится при удалении объектов с громкими матюками вида: "org. springframework. orm. hibernate3. HibernateSystemException: Illegal attempt to associate a collection with two open sessions; nested exception is org. hibernate. HibernateException: Illegal attempt to associate a collection with two open sessions" Народ на форумах срет кирпичами, мучается и многозначительно посылает друг друга в javadoc, где, впрочем, данная магия практически не объясняется. Впрочем, и рыбку съесть и использовать одну сессию возможно и работает это у меня только, если принудительно прописать сбрасывание данных у DAO-объектов. Если используется HibernateTemplate (а он должен использоваться в данном случае), то тогда можно прописать абстрактному DAO класу в паре мест строчки вида: getHibernateTemplate(). flush(); и все, вроде бы, работает нормально, но не очень хорошо это всегда и принудительно сразу же сбрасывать данные в базу. . О чем это я?. . Ах, да, это краткое содержание моего рабочего дня вчера. В переводе на русский звучит как: у меня там в программе одна штука не работает. Поэтому, вот вам позитивные монахи. У них все работает. А даже если и не работает - они все равно не парятся. Философия у них такая. . ) Tweet jQuery. VK. addButton("vk_like_567637538", {"pageUrl":"http://ezheg. livejournal. com/116365. html", "pageTitle":"Про монахов и высокоуровневые абстракции", "verb":"1", "pageDescription":". . Фильтр OpenSessionInViewFilter из энтерпрайзного фреймворка Spring очень странно себя ведет при совместном использовании с паттерном DAO над Hibernate объектами - не обращает …", "type":"mini", "pageImage":"http://petrpopov. ru/photos/lj/nepal/2255w850c. jpg"}); Give 10