Мы используем Hibernate Spring MVC с фильтром OpenSessionInView.
Вот проблема, с которой мы сталкиваемся (псевдокод)
transaction 1
load object foo
transaction 1 end
update foo's properties (not calling session.save or session.update but only foo's setters)
validate foo (using hibernate validator)
if validation fails ?
go back to edit screen
transaction 2 (read only)
load form backing objects from db
transaction 2 end
go to view
else
transaction 3
session.update(foo)
transaction 3 end
проблема в том случае, если проверка не пройдена
foo помечается как «грязный» в сеансе гибернации (поскольку мы используем OpenSessionInView, у нас только один сеанс в запросе http), когда мы загружаем объекты поддержки формы (например, список некоторых сущностей, использующих запрос HQL), переходите в спящий режим перед выполнением запрос проверяет, есть ли в сеансе грязные объекты, он видит, что foo есть, и сбрасывает его, когда транзакция 2 фиксируется, обновления записываются в базу данных.
Проблема заключается в том, что, хотя это транзакция только для чтения и хотя foo не была обновлена в транзакции 2, hibernate не знает, какой объект был обновлен в какой транзакции, и не сбрасывает только объекты из этой транзакции.
Какие-либо предложения? кто-нибудь сталкивался с подобной проблемой до
Обновление: этот пост проливает свет на проблему: http://brian.pontarelli.com/2007/04/03/hibernate-pitfalls-part-2/