Вопрос

Я попробовал это:

@RequestMapping(method = RequestMethod.GET, value = "/getmainsubjects")
@ResponseBody
public JSONArray getMainSubjects( @RequestParam("id") int id) {

List <Mainsubjects> mains = database.getMainSubjects(id, Localization.getLanguage());
JSONArray json = JSONArray.fromObject(mains);
return json;

}

При вызове getmainsubjects.html? Id = 1 Я получаю ошибку:

net.sf.json.jsonexception: org.hibernate.lazyinitializationexception: не удалось лениво инициализировать сбор роли: fi.utu.tuha.domain.mainsubjects.aifors, сеанс или сеанс не были закрыты

Как исправить?

Это было полезно?

Решение

Проблема в том, что у вашего объекта модели были некоторые ассоциации (построенные с помощью OneTomany, Mantotoone и т. Д.), Списки (Persistentags), наборы или что -то в этом роде (коллекция), которые лениво инициализировались. Это означает, что после инициализации набора результатов MainSubjects не указывает на фактический объект сбора, вместо этого прокси. Во время рендеринга, доступа к этим коллекциям, Hibernate пытается получить значения из базы данных с использованием прокси. Но на данный момент нет открытой сессии. По этой причине вы получаете это исключение.

Вы можете либо установить свою стратегию извлечения в Ager (если вы используете аннотации), например: @onetomany (fetch = fetchtype.eager)

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

Или вы можете использовать шаблон OpenSessionInView, который является сервоприводом, открывает новый сеанс, прежде чем ваш запрос в обращении с контроллером и закрывает перед ответами вашего веб -приложения:

   public class DBSessionFilter implements Filter {
        private static final Logger log = Logger.getLogger(DBSessionFilter.class);

        private SessionFactory sf;

        @Override
        public void destroy() {
            // TODO Auto-generated method stub

        }

        @Override
        public void doFilter(ServletRequest request, ServletResponse response,
                FilterChain chain) throws IOException, ServletException {
            try {
                log.debug("Starting a database transaction");
                sf.getCurrentSession().beginTransaction();

                // Call the next filter (continue request processing)
                chain.doFilter(request, response);

                // Commit and cleanup
                log.debug("Committing the database transaction");
                sf.getCurrentSession().getTransaction().commit();

            } catch (StaleObjectStateException staleEx) {
                log.error("This interceptor does not implement optimistic concurrency control!");
                log.error("Your application will not work until you add compensation actions!");
                // Rollback, close everything, possibly compensate for any permanent changes
                // during the conversation, and finally restart business conversation. Maybe
                // give the user of the application a chance to merge some of his work with
                // fresh data... what you do here depends on your applications design.
                throw staleEx;
            } catch (Throwable ex) {
                // Rollback only
                ex.printStackTrace();
                try {
                    if (sf.getCurrentSession().getTransaction().isActive()) {
                        log.debug("Trying to rollback database transaction after exception");
                        sf.getCurrentSession().getTransaction().rollback();
                    }
                } catch (Throwable rbEx) {
                    log.error("Could not rollback transaction after exception!", rbEx);
                }

                // Let others handle it... maybe another interceptor for exceptions?
                throw new ServletException(ex);
            }

        }

        @Override
        public void init(FilterConfig arg0) throws ServletException {
            log.debug("Initializing filter...");
            log.debug("Obtaining SessionFactory from static HibernateUtil singleton");
            sf = HibernateUtils.getSessionFactory();

        }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top