我在使用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);