MySQL hibernate exception: illegal state exception : entityManagerFactory is closed

SF2311

Mitglied
Hallo,
ich beschäftige mich seit kurzem mit Datenbankprogrammierung und schreibe gerade an einer Anwendung. Ich verwende dazu hibernate und es hat auch alles gut funktioniert aber jetzt bekomme ich immer folgende Konsolenausgabe:
Code:
Jan 27, 2017 5:58:44 PM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {5.2.7.Final}
Jan 27, 2017 5:58:44 PM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
Jan 27, 2017 5:58:44 PM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {5.0.1.Final}
Jan 27, 2017 5:58:44 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!)
Jan 27, 2017 5:58:44 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001005: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://localhost:3306/student?useSSL=false]
Jan 27, 2017 5:58:44 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001001: Connection properties: {user=testUser, password=****}
Jan 27, 2017 5:58:44 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001003: Autocommit mode: false
Jan 27, 2017 5:58:44 PM org.hibernate.engine.jdbc.connections.internal.PooledConnections <init>
INFO: HHH000115: Hibernate connection pool size: 1 (min=1)
Jan 27, 2017 5:58:45 PM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect
Jan 27, 2017 5:58:46 PM org.hibernate.hql.internal.QueryTranslatorFactoryInitiator initiateService
INFO: HHH000397: Using ASTQueryTranslatorFactory
Hibernate: select student0_.Ausweisnr as Ausweisn1_0_, student0_.Vorname as Vorname2_0_, student0_.Klasse as Klasse3_0_, student0_.Nachname as Nachname4_0_, student0_.Anwesend as Anwesend5_0_ from student student0_ where student0_.Anwesend='Ja'
Jan 27, 2017 5:58:46 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop
INFO: HHH10001008: Cleaning up connection pool [jdbc:mysql://localhost:3306/student?useSSL=false]
Exception in thread "main" java.lang.IllegalStateException: EntityManagerFactory is closed
    at org.hibernate.internal.SessionFactoryImpl.validateNotClosed(SessionFactoryImpl.java:490)
    at org.hibernate.internal.SessionFactoryImpl.getCache(SessionFactoryImpl.java:761)
    at org.hibernate.internal.AbstractSharedSessionContract.<init>(AbstractSharedSessionContract.java:141)
    at org.hibernate.internal.AbstractSessionImpl.<init>(AbstractSessionImpl.java:29)
    at org.hibernate.internal.SessionImpl.<init>(SessionImpl.java:248)
    at org.hibernate.internal.SessionFactoryImpl$SessionBuilderImpl.openSession(SessionFactoryImpl.java:1202)
    at org.hibernate.internal.SessionFactoryImpl.openSession(SessionFactoryImpl.java:441)
    at sas.SQL.getListOnline(SQL.java:164)
    at sas.SQL.updateLists(SQL.java:93)
    at sas.Launcher.main(Launcher.java:31)
Die Launcher Klasse:

Java:
import java.awt.event.ActionListener;
import java.awt.event.ComponentListener;
import java.util.List;

public class Launcher {

   

    public static void main(String[] args) {
       
        SQL sql;
        SASBorder window;
   
        ComponentListener cl;
        ActionListener al;
       
        sql = new SQL();
        window = Window.getInstance(sql);
        sql.setWindow(window);
        al = new ActionHandler(sql,window);
        window.getBtnNewCreate().addActionListener(al);
        window.getBtnEditEnter().addActionListener(al);
        window.getBtnEditSearch().addActionListener(al);
        window.getBtnEditEnter().setEnabled(false);
       
        sql.updateLists();
            cl = new ComponentHandler(window);
            window.addComponentListener(cl);
    }

    }

und die Methode die als fehlerquelle angegeben ist:

Java:
    @SuppressWarnings("unchecked")
    public List<Student> getListOnline(String state) {
        try {
            Session session = sf.openSession();
            session.beginTransaction();
            list = (List<Student>) session.createQuery("from Student s where s.online = '" + state + "'")
                    .getResultList();
            session.close();
            return list;
        } finally {
            sf.close();
        }
    }

Vielen Dank für die Hilfe schonmal im voraus🙂
 
Da passiert mir noch ein wenig zu viel Magie.
Zeig mal den Code wo du deinen EntityManager erstellst.
Spontan fällt mir nur ein, dass du eventuell die factory vorzeitig geschlossen hast was implizit auch den EntityManager schließt.
 
ich verwende die hibernate session und die sessionFactory.
bis jetzt hat das auch ohne entityManager super funktioniert und beim googeln hab ich herausgefunden, dass das der Weg ist wie man mit hibernate Arbeiten sollte.
Der Code für die sessionFactory:
Java:
       StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder().configure("hibernate.cfg.xml")
               .build();

       Metadata metadata = new MetadataSources(standardRegistry).addAnnotatedClass(Student.class).getMetadataBuilder()
               .applyImplicitNamingStrategy(ImplicitNamingStrategyJpaCompliantImpl.INSTANCE).build();

       SessionFactoryBuilder sessionFactoryBuilder = metadata.getSessionFactoryBuilder();

       sf = sessionFactoryBuilder.build();
 
bis jetzt hat das auch ohne entityManager super funktioniert und beim googeln hab ich herausgefunden, dass das der Weg ist wie man mit hibernate Arbeiten sollte.
Hmm, ich kenne es eigentlich genau anders herum, aber es sollte beides funktionieren.

1. Bei openSession() solltest du wissen, dass du den gesamten Cleanup durchführen musst (close & flush)
D.h. du solltest dein session.close() in den finally ziehen und den return komplett aus dem try.
Noch besser: Falls du nicht unbedingt deine Session selber managen muss, dann benutzte einfach
getCurrentSession() und spar dir das closen und flushen.

2. Du schliesst deine factory in dem finally. Falls es die gleiche Wirkung hat, wie bei der EMFactory, dann wird der EM an dieser Stelle geschlossen.
Wird in updateLists() vorher schoneinmal eine session benutzt bzw. sf.close(); aufgerufen?
 
Vielen Dank erstmal für die Hilfe.
1. Nein es ist das erste mal,dass überhaupt etwas aufgerufen wird. Der Fehler kommt direkt beim Programmstart. Ich versuch es jetzt mal mit getCurrentSession().

2.Wo soll ich die Factory denn schließen? Muss ich sie überhaupt schließen?
 
Vielen Dank!!
Ich habe es jetzt so probiert:
Code:
@SuppressWarnings("unchecked")
    public List<Student> getListOnline(String state) {
        try {
            Session session = sf.getCurrentSession();
            session.beginTransaction();
            list = (List<Student>) session.createQuery("from Student s where s.online = '" + state + "'")
                    .getResultList();
            session.getTransaction().commit();
           
        } finally {
            //sf.close();
        }
        return list;
    }

Und es funktioniert!!🙂

Danke
 

Zurück
Oben