Hibernate中的问题:会话已关闭



我在使用Hibernate在Eclipse执行的应用程序时遇到了这个问题。在这里,我向您展示stacktrace和主要的Java类。

Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Session/EntityManager is closed
at org.hibernate.internal.AbstractSharedSessionContract.checkOpen(AbstractSharedSessionContract.java:332)
at org.hibernate.engine.spi.SharedSessionContractImplementor.checkOpen(SharedSessionContractImplementor.java:126)
at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:647)
at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:102)
at vista.Principal$2.actionPerformed(Principal.java:124)
.
.
.

,在这里,主类的一部分有问题。

JList listaConsultas = new JList();
scroll.setViewportView(listaConsultas);
SessionFactory sesionfact1 = HibernateUtil.getSessionFactory();
Session sesion1 = sesionfact1.openSession();
Transaction tr = sesion1.beginTransaction();
JButton btnConsultar = new JButton("CONSULTAR");
btnConsultar.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) {
        Query queryAcogida = sesion1.createQuery("SELECT s FROM rah_histo_saip_acogida s WHERE fecharealiza BETWEEN :desde AND :hasta")
            .setParameter("desde",fechaDesde)
            .setParameter("hasta", fechaHasta);
        List<RahHistoSaipAcogida> listaAcogida = queryAcogida.list();
        queryAcogida.setFetchSize(10);
        DefaultListModel dlm = new DefaultListModel();
        dlm.addElement("----ACOGIDA DEL PACIENTE----");
        for(RahHistoSaipAcogida acog: listaAcogida){
            dlm.addElement(acog.toString());    
            listaConsultas.setModel(dlm);
        }
    }
});
tr.commit();
sesion1.close();
btnConsultar.setBounds(281, 113, 120, 23);
contentPane.add(btnConsultar);
public void actionPerformed(ActionEvent arg0) {

声明它时未调用。真正的工作流程是:

JList listaConsultas = new JList();
scroll.setViewportView(listaConsultas);
SessionFactory sesionfact1 = HibernateUtil.getSessionFactory();
Session sesion1 = sesionfact1.openSession();
Transaction tr = sesion1.beginTransaction();
JButton btnConsultar = new JButton("CONSULTAR");
tr.commit();
sesion1.close();
btnConsultar.setBounds(281, 113, 120, 23);
contentPane.add(btnConsultar);
... and later ...
actionPerformed(ActionEvent arg0)

因此,当执行操作时,交易也关闭,并且会议也是如此。您应该在执行的操作方法中添加会话操作,例如:

JList listaConsultas = new JList();
scroll.setViewportView(listaConsultas);
SessionFactory sesionfact1 = HibernateUtil.getSessionFactory();
JButton btnConsultar = new JButton("CONSULTAR");
btnConsultar.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) {
        Session sesion1 = sesionfact1.openSession();
        Transaction tr = sesion1.beginTransaction();
        Query queryAcogida = sesion1.createQuery("SELECT s FROM rah_histo_saip_acogida s WHERE fecharealiza BETWEEN :desde AND :hasta")
            .setParameter("desde",fechaDesde)
            .setParameter("hasta", fechaHasta);
        List<RahHistoSaipAcogida> listaAcogida = queryAcogida.list();
        queryAcogida.setFetchSize(10);
        DefaultListModel dlm = new DefaultListModel();
        dlm.addElement("----ACOGIDA DEL PACIENTE----");
        for(RahHistoSaipAcogida acog: listaAcogida){
            dlm.addElement(acog.toString());    
            listaConsultas.setModel(dlm);
        }
        tr.commit();
        sesion1.close();
    }
});
btnConsultar.setBounds(281, 113, 120, 23);
contentPane.add(btnConsultar);

最新更新