Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [JSF] Problema con sessioni hibernate

    ciao!
    io ho questo bean:
    codice:
    @ManagedBean(name = "lb")
    @SessionScoped
    public class LavoriBean {
    
        private String titolo;
        private String testo;
        private DataModel lavori;
        private LavoriHelper helper;
    
        public LavoriBean() {
            helper = new LavoriHelper();
        }
    
        public String getTitolo() {
            return titolo;
        }
    
        public void setTitolo(String titolo) {
            this.titolo = titolo;
        }
    
        public String getTesto() {
            return testo;
        }
    
        public void setTesto(String testo) {
            this.testo = testo;
        }
    
        public DataModel getLavori() {
            if (lavori == null) {
                lavori = new ListDataModel(helper.getLavori());
            }
            return lavori;
        }
    
        public void addLavoro() {
            helper.addLavoro(null, titolo, testo, new Date(), 0);
            FacesMessage fMsg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Lavoro inserito", null);
            FacesContext fc = FacesContext.getCurrentInstance();
            fc.addMessage(null, fMsg);
            UIViewRoot uiViewRoot = fc.getViewRoot();
            HtmlInputText txtTitolo = (HtmlInputText) uiViewRoot.findComponent("frm_add_lavoro:titolo");
            txtTitolo.setValue("");
            HtmlInputTextarea txtTesto = (HtmlInputTextarea) uiViewRoot.findComponent("frm_add_lavoro:testo");
            txtTesto.setValue("");
        }
    
        public void recreateModel() {
            lavori = null;
        }
    }
    da qui eseguo una query per pendere i dati, e ho anche un metodo per inserire i dati nel db.

    vado in home page e prendo i dati che stanno nel db, e fin qui tutto ok.
    poi ho un form che richiama addLavoro() che aggiunge i dati al db, e funziona.
    solo che se rivado in home l'ultimo record non c'è e devo rilanciare il progrmma.
    come se usasse ancora la sessione vecchia.
    questa la classe helper:
    codice:
    public class LavoriHelper {
    
        Session session = null;
    
        public LavoriHelper() {
            this.session = HibernateUtil.getSessionFactory().getCurrentSession();
        }
    
        public void addLavoro(LavoriSezioni lavoriSezioni, String titolo, String testo, Date data, Integer ordine) {
            Transaction tx = session.beginTransaction();
            Integer lavoroId = null;
            Lavori l = new Lavori(lavoriSezioni, titolo, testo, data, ordine);
            lavoroId = (Integer) session.save(l);
            tx.commit();
        }
    
        public List<LavoriSezioni> getLavori() {
            Transaction tx = session.beginTransaction();
            Query q = session.createQuery("from Lavori");
            List<LavoriSezioni> list = (List<LavoriSezioni>) q.list();
            return list;
        }
    }
    e questa la classe HibernateUtil
    codice:
    public class HibernateUtil {
    
        private static final SessionFactory sessionFactory;
    
        static {
            try {
                sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
            } catch (Throwable ex) {
                throw new ExceptionInInitializerError(ex);
            }
        }
    
        public static SessionFactory getSessionFactory() {
            return sessionFactory;
        }
    }
    qualcuno ha qualche suggerimento??

  2. #2
    dovrei avercela fatta:
    codice:
    public class LavoriHelper {
    
        Session session = null;
        SessionFactory factory = null;
    
        public LavoriHelper() {
            factory = HibernateUtil.getSessionFactory();
        }
    
        private void openSession() {
            if (session == null || !session.isOpen()) {
                session = factory.openSession();
            } else {
                session = factory.getCurrentSession();
            }
        }
    
        public void addLavoro(LavoriSezioni lavoriSezioni, String titolo, String testo, Date data, Integer ordine) {
            openSession();
            Transaction tx = session.beginTransaction();
            Integer lavoroId = null;
            Lavori l = new Lavori(lavoriSezioni, titolo, testo, data, ordine);
            lavoroId = (Integer) session.save(l);
            tx.commit();
        }
    
        public List<LavoriSezioni> getLavori() {
            openSession();
            Transaction tx = session.beginTransaction();
            Query q = session.createQuery("from Lavori");
            List<LavoriSezioni> list = (List<LavoriSezioni>) q.list();
            return list;
        }
    }
    poi nel bean:
    codice:
        public void addLavoro() {
            helper.addLavoro(null, titolo, testo, new Date(), 0);
            FacesMessage fMsg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Lavoro inserito", null);
            FacesContext fc = FacesContext.getCurrentInstance();
            fc.addMessage(null, fMsg);
            UIViewRoot uiViewRoot = fc.getViewRoot();
            HtmlInputText txtTitolo = (HtmlInputText) uiViewRoot.findComponent("frm_add_lavoro:titolo");
            txtTitolo.setValue("");
            HtmlInputTextarea txtTesto = (HtmlInputTextarea) uiViewRoot.findComponent("frm_add_lavoro:testo");
            txtTesto.setValue("");
    //        fc.getExternalContext().redirect("");
            recreateModel();
        }
    
        public void recreateModel() {
            lavori = null;
        }
    così pare funzionare.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.