Frage

Ich habe das versucht:

@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;

}

Beim Aufrufen von GetMainsubjects.html? Id = 1 Ich erhalte den Fehler:

net.sf.json.jsonexception: org.hibernate.lazyInitializationException: Eine Sammlung von Rolle nicht faul initialisieren: fi.utu.tuha.domain.mainsubjects

Wie repariert man?

War es hilfreich?

Lösung

Das Problem ist, dass Ihr Modellobjekt -Mainsubjects einige Assoziationen (gebaut von Onetomany, Manytoone usw.), Listen (Persistentbags), Sets oder etwas (Sammlung) wie diesem, das träge initialisiert hat, aufgelistet. Nach der Initialisierung des Ergebnissatzes zeigt MainSubjects nicht auf ein tatsächliches Sammelobjekt, statt Proxies. Während des Renderns wird der Hibernate beim Rendern auf diese Sammlungen versucht, die Werte mit Proxys aus der Datenbank aus zu erhalten. Aber an dieser Stelle ist keine Sitzung geöffnet. Aus diesem Grund bekommen Sie diese Ausnahme.

Sie können entweder Ihre Abfassungsstrategie auf eifrig festlegen (wenn Sie Anmerkungen verwenden) wie folgt: @onetomany (fetch = fetchType.eager)

Bei dieser Methode müssen Sie sich bewusst sein, dass Sie nicht mehr als einen persistentbag initialisierten zulassen können.

Oder Sie können das OpenSessionInview -Muster verwenden, das sich um einen Servletfilter handelt, der eine neue Sitzung eröffnet, bevor die Anforderung von Controller mitgeteilt wird, und schließt vor Ihren Webanwendungen ab:

   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();

        }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top