Как передать (правильно) Java-объект из сервлета на страницу JSP - PullRequest
0 голосов
/ 11 января 2011

Я был везде в сети, я немного растерялся и не смог решить мою проблему.

Я создаю веб-приложение с использованием Eclipse, с JSP на стороне клиента и Servet / Hibernate на стороне сервера. Я пытаюсь передать объект на страницу JSP из сервлета.

В сервлете:

Contact c = dao.getContact(dataID);

request.setAttribute("data", c);

getServletContext()
    .getRequestDispatcher("/"+url+"?id="+dataID).forward(request, response);

На странице JSP:

Contact contact = (Contact)request.getAttribute("data");

Контакт - это ORM, который имеет такие атрибуты, как "фамилия".

Но я получаю это сообщение об ошибке:

GRAVE: "Servlet.service()" pour la servlet GetData a généré une exception
org.hibernate.HibernateException: No CurrentSessionContext configured!
    at org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:683)
    at domain.DAOContact.getContact(DAOContact.java:39)
    at domain.GetData.doGet(GetData.java:27)

Поэтому я попытался выяснить, почему, и где-то я прочитал, что мне нужно установить текущий контекст сеанса в «thread» в файле конфигурации hibernate. Но когда я сделал это, я получил это сообщение:

GRAVE: Servlet.service() for servlet [GetData] in context with path [/CarnetContacts] threw exception [org.hibernate.LazyInitializationException: could not initialize proxy - no Session] with root cause
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
    at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:167)
    at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:215)
    at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190)
    at domain.Contact_$$_javassist_1.getLastName(Contact_$$_javassist_1.java)

Вторая строка сообщения указывает, что это связано с отложенной загрузкой, но последняя строка показывает, что ошибка возникает, когда программа пытается получить атрибут «lastname», который в основном является строкой, поэтому я не не думаю, что это "ленивый груз".

Так что, если кто-нибудь может помочь мне найти решение, это было бы очень любезно.

Код метода дао:

    public Contact getContact(int contactId){
        Session session = HibernateSessionFactory.getSessionFactory().getCurrentSession();
        Transaction t = session.beginTransaction();
        t.begin();
        Contact contact =(Contact) session.load(Contact.class, new Integer(contactId));
        t.commit();
        return contact; 
    }

1 Ответ

2 голосов
/ 11 января 2011

Ваша конкретная проблема в этом случае состоит в том, что вы используете Session.load() вместо Session.get().

load() возвращает прокси с ленивой инициализацией, поэтому его следует использовать только в особых случаях, вВ большинстве случаев вам нужно использовать get().

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

  • Использование Шаблон Open Session in View

  • Извлечение всех необходимых данных перед визуализацией представления (с использованием JOIN FETCH, Hibernate.initialize() и т. Д.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...