Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Связь доменных объектов внутри JSP 
V
    Опции темы
Nofate
Дата 13.5.2009, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 266
Регистрация: 13.10.2008

Репутация: 2
Всего: 8



Доброго времени суток. 
Осваиваю разработку веб-приложений.И столкнулся с первой проблемой, которую не могу самостоятельно разрешить.

Есть два класса доменных объектов. Данные лежат в базе, мыппинг через Hibernate. Customer связан с  Question как один-ко-многим. 
Код

public class Question {
    private Long id;
    private Customer customer;
    private Long customerFace;
    
    private String title;
    private String text;
    private String answer;
    
    //сэты и гэты
}

public class Customer {
    private Long id;
    private String name;

    //сэты и гэты
}


Над ними лежит dao слой. На данный момент главное что он делает - возвращает коллекцию Question'ов.
Код

public class QuestionDAO {
    public List<Question> findQuestion() {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        List<Question> result = session.createQuery(" from Question order by reg_date").list();
        session.getTransaction().commit();
        return result;
    }

       //еще методы
}


Есть сервлет, подготавливающий данные для JSP и заворачивающий их в один класс.
Код

public class MainForm {
    private Collection<Question> questions;
        //прочие поля данных
        //сэты и гэты
}

public class QuestionServlet extends HttpServlet {

    private static final long serialVersionUID = 4725325388514982469L;

    protected void processRequest(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        
        MainForm f = new MainForm();
        f.setQuestions(new QuestionDAO().findQuestion());
        req.setAttribute("form", f);
        getServletContext().getRequestDispatcher("/WEB-INF/jsp/questions.jsp").forward(req, resp);
    }
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        processRequest(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        processRequest(req, resp);
    }

}


И собственно проблема: на JSP-странице формируется таблица из коллекции Question'ов (по строчке на объект). Как мне обратиться к  связанному с Question объекту Customer и его полям? Или проблема концептуально-архитектурная?

Код

<c:forEach var="q" items="${form.questions}" >
    <tr>
                <td>${q.id}</td>
        <td>${q.title}</td>
        <td>${q.customer.name}</td>                  <!-- -здесь ругается -->
    </tr>
</c:forEach>




--------------------
The future is not set, there is no fate but what we make for ourselves.
Нофейтово пространство и смежные области 
PM MAIL WWW ICQ   Вверх
_and
Дата 13.5.2009, 05:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-developer
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 6.8.2004
Где: Новокузнецк

Репутация: 1
Всего: 4



Цитата(Nofate @  13.5.2009,  04:34 Найти цитируемый пост)
<td>${q.customer.name}</td>                  <!-- -здесь ругается -->

и как ругается
PM MAIL ICQ Jabber   Вверх
Nofate
Дата 13.5.2009, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 266
Регистрация: 13.10.2008

Репутация: 2
Всего: 8



ссори, сразу не догадался кинуть

Код

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException: An exception occurred processing JSP page /WEB-INF/jsp/questions.jsp at line 41

40:                        <td>${q.title}</td>
41:                        <td>${q.customer.name}</td>
42:                        <td>${q.worker}</td>

Stacktrace:
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:505)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:416)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    ru.firmaorto.web.QuestionServlet.processRequest(QuestionServlet.java:23)
    ru.firmaorto.web.QuestionServlet.doGet(QuestionServlet.java:28)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

root cause

org.hibernate.LazyInitializationException: could not initialize proxy - no Session
    org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:86)
    org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:140)
    org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190)
    ru.firmaorto.domain.Customer_$$_javassist_2.toString(Customer_$$_javassist_2.java)
    org.apache.el.lang.ELSupport.coerceToString(ELSupport.java:320)
    org.apache.el.lang.ELSupport.coerceToType(ELSupport.java:350)
    org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:188)
    org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:925)
    org.apache.jsp.WEB_002dINF.jsp.questions_jsp._jspx_meth_c_005fforEach_005f0(questions_jsp.java:149)
    org.apache.jsp.WEB_002dINF.jsp.questions_jsp._jspService(questions_jsp.java:97)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    ru.firmaorto.web.QuestionServlet.processRequest(QuestionServlet.java:23)
    ru.firmaorto.web.QuestionServlet.doGet(QuestionServlet.java:28)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

Apache Tomcat/6.0.18



--------------------
The future is not set, there is no fate but what we make for ourselves.
Нофейтово пространство и смежные области 
PM MAIL WWW ICQ   Вверх
garbuz
Дата 13.5.2009, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 8
Всего: 11



Nofate, поздравляю вас! Теперь вы тоже познакомитесь с ленивыми данными. 
В ваше случае могу посоветовать использовать Hibernate.initialize
PM MAIL   Вверх
Nofate
Дата 13.5.2009, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 266
Регистрация: 13.10.2008

Репутация: 2
Всего: 8



Большое спасибо. Инициализация помогла. Самое смешное, что я ее сознательно не писал - наткнувшись в "Студенческом отделе кадров"  на 
Код

        Applicant result = (Applicant) session.load(Applicant.class, applicantId);
        // Насильная инициализация списка. Вообщем-то не очень хорошая практика так делать
        Hibernate.initialize(result.getApplicantResultList());

решил посмотреть что будет, если её не сделать. Вот и получил по лбу своими заботливо уложенными граблями.

Не ясно одно: почему инициализацию делать не очень хорошо, если без нее никак?  


--------------------
The future is not set, there is no fate but what we make for ourselves.
Нофейтово пространство и смежные области 
PM MAIL WWW ICQ   Вверх
_and
Дата 14.5.2009, 04:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-developer
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 6.8.2004
Где: Новокузнецк

Репутация: 1
Всего: 4



Nofate, тема уже была с такой ошибкой не давно надо было воспользоваться поиском
PM MAIL ICQ Jabber   Вверх
Nofate
Дата 14.5.2009, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 266
Регистрация: 13.10.2008

Репутация: 2
Всего: 8



Извините, пролистал, страниц 10 в результатах поиска - не нашел. Я ведь думал что проблема в сервлете или JSP.


--------------------
The future is not set, there is no fate but what we make for ourselves.
Нофейтово пространство и смежные области 
PM MAIL WWW ICQ   Вверх
_and
Дата 14.5.2009, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-developer
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 6.8.2004
Где: Новокузнецк

Репутация: 1
Всего: 4



по ошибке сразу видно что ругается хибернейт
PM MAIL ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0782 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.