2010-06-09 1 views
1

У меня следующая проблема:Как сохранить сессии Hibernate под открытым до тех пор, пока страница визуализируется

  • Я использую Oracle ADF для просмотра и управления моего приложения.
  • С OpenSessionInViewFilter я перехватываю запрос и открываю сеанс Hibernate, и он закрывается, как только заканчивается метод bean.

Мне нужно, чтобы сессия открывалась до тех пор, пока страница не будет отображаться, потому что в моем JSP y используются ленивые атрибуты объекта, который я загружаю из БД.

Например:

Когда я вхожу index.jspx в IndexBean # магистралью() выполняется:

public class IndexBean{ 
    private DBObject myDBObject; 
    public String main(){ 
     this.myDBObject = this.myDAO.loadObjectFromDB(); 
     return null; 
    } 
} 

в index.jspx у меня есть:

... 
<af:inputText value="#{myDBObject.lazyAttribute}" /> 
... 

Я бы подобно тому, что сеанс Hibernate открыт до тех пор, пока обработчик af: inputText не будет обработан.

Возможно ли это? Как?

Заранее спасибо

+1

'OpenSessionInViewFilter' * does * держит его открытым, пока не отобразится представление. Если это не так, значит, это неправильно. – skaffman

ответ

1

Наконец-то я решил свою проблему.

OpenSessionInViewFilter работает правильно.

Была проблема с компонентом <af:table>, который я использовал ... Странно, что <af:table> создает новый запрос. Этот новый запрос закрывался и создавался новый сеанс Hibernate.

+0

Проблема с компонентом af: table решается с добавлением следующего атрибута: contentDelivery = "instant" – Neuquino

0

Я предлагаю вам держать ваш взгляд развязки от модели и устранить отложенную загрузку. Дайте странице все необходимые данные, прежде чем они будут визуализированы. Если выборка дополнительных данных действительно представляет большой успех, подумайте о повторной разработке приложения, чтобы представить эти данные отдельно.

+0

Презентация данных, это не мое определение, является клиентом. Устранить ленивую загрузку - это не вариант. Мое мнение это развязано, поскольку представление должно быть прозрачным, если атрибут был загружен до или в этот момент ... af: inputText вызывает только getMyDBObject(). GetLazyAttribute() и ожидает значения. Если значение было загружено, оно возвращает значение, в противном случае оно должно запрашивать его для модели ... – Neuquino

+0

@Neuquino, вы ошибаетесь, getter getLazyAttribute() не является простым getter для внутренней переменной, он использует некоторую неожиданную зависимость, поэтому ваш объект не может быть передан на другой уровень, потому что эта зависимость там не будет существовать. Если вы хотите продолжить писать с использованием двухуровневого дизайна, это нормально, но вы должны знать все проблемы, с которыми вы столкнетесь (особенно когда кто-то другой - клиент пишет слой презентации). Чтобы исправить это для двух уровней, просто убедитесь, что OpenSessionInViewFilter работает. –

+1

Если ваше представление запрашивает базу данных для данных, оно не отделено. Он не может «жить сам по себе», так сказать - это зависит от базы данных (которая живет в другом ярусе). – TMN

Смежные вопросы