Мы используем OpenSessionInView с нашим приложением Spring MVC. Я не уверен, как лучше справиться с этой ситуацией. В основном потому, что я не очень хорошо знаком с Hibernate. У нас есть 2 объекта, которые загружаются для каждой просматриваемой страницы. Давайте представим, что мы работаем над CMS. Таким образом, мы должны загрузить человека, который вошел в систему на каждой странице, и на каком сайте они в настоящее время работают. Во время нормального хода операций эти данные не изменяются.
У нас есть специальный перехватчик, который в основном выглядит следующим образом:
public class PersistenceInterceptor implements HandlerInterceptor {
private PlatformTransactionManager transactionManager; //from spring
private TransactionStatus transactionStatus;
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
this.transactionStatus = transactionManager.getTransaction(new DefaultTransactionDefinition());
if (handler instanceof SpecialInterface) {
handler.setPerson(loadPersonByKey(session.getAttribute(PERSON_KEY)));
handler.setSite(loadSiteByKey(session.getAttribute(SITE_KEY)));
}
return true;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//Wrapped in try catch & rolled back if unable to commit
transactionManager.commit(transactionStatus);
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
if (ex != null && !transactionStatus.isCompleted()) {
transactionManager.rollback(transactionStatus);
}
}
Было бы лучше, если бы мы изменили способ, которым мы идем по этому поводу, и просто немного изменили его, чтобы использовать нашу сконфигурированную Hibernate sessionFactory для получения сеанса, а затем обновите человека и сайт - или мы все равно будем загружать эти значения?
Очевидно, что эти запросы не такие тяжелые, но бывают случаи, когда было бы полезно сохранить другие вещи, которые немного тяжелее, чтобы попытаться выгрузить работу из БД.