webentwicklung-frage-antwort-db.com.de

Ruhezustand: Kein CurrentSessionContext konfiguriert

Ich stecke wegen eines dummen Fehlers irgendwo fest, kann es aber nicht herausfinden!

Hibernate 4.2.6

Ich habe auf diese Frage Bezug genommen, die ich bereits mehrfach gestellt habe, zum Beispiel hier

hibernate.cfg.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration SYSTEM
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>
        <property name="hibernate.bytecode.use_reflection_optimizer">false</property>

        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.password">root</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property>
        <property name="hibernate.connection.username">root</property>

        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>

        <property name="show_sql">true</property>

        <property name="hibernate.current_session_context_class">org.hibernate.context.ThreadLocalSessionContext</property>

        <mapping resource="Event.hbm.xml"></mapping>
    </session-factory>
</hibernate-configuration>

Event.hbm.xml

<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

    <class name="com.db.pojo.Event" table="Events">

        <id name="id" column="Id">
            <generator class="native"></generator>
        </id>
        <property name="title" column="Title"></property>

        <property name="date" column="Date" type="timestamp"></property>

    </class>

</hibernate-mapping>

HibernateUtil

package com.db.util;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistryBuilder;

public class HibernateUtil {

    private static final SessionFactory sessionFactory = buildSessionFactory();

    private static SessionFactory buildSessionFactory() {
        // TODO Auto-generated method stub

        Configuration configuration = new Configuration();
        configuration.configure("hibernate.cfg.xml");

        ServiceRegistryBuilder serviceRegistryBuilder = new ServiceRegistryBuilder()
                .applySettings(configuration.getProperties());
        return configuration.buildSessionFactory(serviceRegistryBuilder
                .buildServiceRegistry());
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }

}

Wann immer ich das versuche:

Session session = HibernateUtil.getSessionFactory().getCurrentSession();

Ich bekomme :

Exception in thread "main" org.hibernate.HibernateException: No CurrentSessionContext configured!
    at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.Java:988)
    at test.EventManager.createAndStoreEvent(EventManager.Java:27)
    at test.EventManager.main(EventManager.Java:17)

Nach dem Ausführen auf meinem persönlichen Laptop bearbeitet

  1. Der Code läuft gut, wenn ich 'thread' in der cfg-Datei verwende
  2. Wenn ich 'ThreadLocalSessionContext' verwende, erhalte ich die folgende Ausnahme ( Bitte beachten Sie, dass auch die Ausgabe auf der Konsole jetzt enorm ist als die vorherige Ausführung - ist es, dass die Klasse 'ThreadLocalSessionContext' in der Version 3.0 nicht vorhanden war ( Ich habe versucht, in der API zu finden, aber die Site hat nicht die ältere API)

Jetzt bin ich misstrauisch gegenüber dem dtd - werden Hibernate 3.0-Jars irgendwo verwiesen, während die lokalen ignoriert werden, obwohl SYSTEM angegeben ist? Die vorherige Ausnahme (kein aktueller Kontext) ist aufgetreten, als der Code auf einem Computer mit eingeschränktem Internetzugang ausgeführt wurde. Aber als ich dasselbe auf meinem persönlichen Laptop ausführte:

eventDesciption : Team eventDate : 2013-12-12
Nov 28, 2013 8:55:59 PM org.hibernate.annotations.common.reflection.Java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {4.0.4.Final}
Nov 28, 2013 8:55:59 PM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {4.2.6.Final}
Nov 28, 2013 8:55:59 PM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
Nov 28, 2013 8:55:59 PM org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
Nov 28, 2013 8:55:59 PM org.hibernate.cfg.Configuration configure
INFO: HHH000043: Configuring from resource: hibernate.cfg.xml
Nov 28, 2013 8:55:59 PM org.hibernate.cfg.Configuration getConfigurationInputStream
INFO: HHH000040: Configuration resource: hibernate.cfg.xml
Nov 28, 2013 8:55:59 PM org.hibernate.cfg.Configuration addResource
INFO: HHH000221: Reading mappings from resource: resources/Event.hbm.xml
Nov 28, 2013 8:55:59 PM org.hibernate.cfg.Configuration doConfigure
INFO: HHH000041: Configured SessionFactory: null
Nov 28, 2013 8:55:59 PM org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000402: Using Hibernate built-in connection pool (not for production use!)
Nov 28, 2013 8:55:59 PM org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000115: Hibernate connection pool size: 20
Nov 28, 2013 8:55:59 PM org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000006: Autocommit mode: false
Nov 28, 2013 8:55:59 PM org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000401: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://localhost:3306/test]
Nov 28, 2013 8:55:59 PM org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000046: Connection properties: {user=root, password=****}
Nov 28, 2013 8:56:00 PM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect
Nov 28, 2013 8:56:00 PM org.hibernate.engine.jdbc.internal.LobCreatorBuilder useContextualLobCreation
INFO: HHH000423: Disabling contextual LOB creation as JDBC driver reported JDBC version [3] less than 4
Nov 28, 2013 8:56:00 PM org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService
INFO: HHH000399: Using default transaction strategy (direct JDBC transactions)
Nov 28, 2013 8:56:00 PM org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init>
INFO: HHH000397: Using ASTQueryTranslatorFactory
Nov 28, 2013 8:56:00 PM org.hibernate.internal.SessionFactoryImpl buildCurrentSessionContext
ERROR: HHH000302: Unable to construct current session context [org.hibernate.context.ThreadLocalSessionContext]
org.hibernate.service.classloading.spi.ClassLoadingException: Unable to load class [org.hibernate.context.ThreadLocalSessionContext]
    at org.hibernate.service.classloading.internal.ClassLoaderServiceImpl.classForName(ClassLoaderServiceImpl.Java:152)
    at org.hibernate.internal.SessionFactoryImpl.buildCurrentSessionContext(SessionFactoryImpl.Java:1544)
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.Java:516)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.Java:1790)
    at com.db.util.HibernateUtil.buildSessionFactory(HibernateUtil.Java:19)
    at com.db.util.HibernateUtil.<clinit>(HibernateUtil.Java:9)
    at test.EventManager.createAndStoreEvent(EventManager.Java:27)
    at test.EventManager.main(EventManager.Java:17)
Caused by: Java.lang.ClassNotFoundException: Could not load requested class : org.hibernate.context.ThreadLocalSessionContext
    at org.hibernate.service.classloading.internal.ClassLoaderServiceImpl$AggregatedClassLoader.findClass(ClassLoaderServiceImpl.Java:319)
    at Java.lang.ClassLoader.loadClass(Unknown Source)
    at Java.lang.ClassLoader.loadClass(Unknown Source)
    at Java.lang.Class.forName0(Native Method)
    at Java.lang.Class.forName(Unknown Source)
    at org.hibernate.service.classloading.internal.ClassLoaderServiceImpl.classForName(ClassLoaderServiceImpl.Java:149)
    ... 7 more

Exception in thread "main" org.hibernate.HibernateException: No CurrentSessionContext configured!
    at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.Java:988)
    at test.EventManager.createAndStoreEvent(EventManager.Java:27)
    at test.EventManager.main(EventManager.Java:17)
26

Nach meinem besten Wissen ist Ihre Konfiguration für die aktuelle Sitzung nicht geeignet. Anstatt

<property name="hibernate.current_session_context_class">org.hibernate.context.ThreadLocal‌​SessionContext</property>

verwenden

<property name="hibernate.current_session_context_class">thread</property>

Weitere Informationen hierzu finden Sie unter folgendem Link:

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/architecture.html#architecture-current-session

Lesen Sie insbesondere die letzten Zeilen des letzten Absatzes.

Für diejenigen, die Hibernate 4.1 verwenden,

<property name="hibernate.current_session_context_class">org.hibernate.context.internal.ThreadLocalSessionContext</property>

Referenz: https://docs.jboss.org/hibernate/orm/4.1/javadocs/org/hibernate/context/internal/ThreadLocalSessionContext.html

53
RAS

Versuchen Sie es zu ändern

Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 

zu:

Session session = HibernateUtil.getSessionFactory().openSession();
16
Mukesh S

Sie müssen Ihr Eigentum ändern:

org.hibernate.context.internal.ThreadLocalSessionContext to Thread

4
user4895905

Für den Ruhezustand 4.x müssen Sie org.hibernate.context.internal.ThreadLocalSessionContext anstelle von org.hibernate.context.ThreadLocalSessionContext verwenden.

Sie können die Eigenschaft jedoch einfach auf thread und nicht auf Thread festlegen.

<property name="hibernate.current_session_context_class">thread</property>
2
Mu'ath Baioud

Ich weiß, dass dies ein alter Beitrag ist, aber nur für den Fall, dass jemand wie ich hierher kommt - das funktioniert:

package com.spring.util;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {

private static HibernateUtil instance = new HibernateUtil();

private SessionFactory sessionFactory;

private HibernateUtil(){
    this.sessionFactory = buildSessionFactory();
}

private synchronized static SessionFactory buildSessionFactory() {
    return new Configuration().configure().buildSessionFactory();
}

public static HibernateUtil getInstance() {
    if(instance == null){
        return new HibernateUtil();
    }
    return instance;
}

public SessionFactory getSessionFactory() {
    return sessionFactory;
}

}

Das aufzurufen ist ganz einfach:

SessionFactory sessionFactory = HibernateUtil.getInstance().getSessionFactory();

Und der nächste Schritt wäre so etwas wie:

public void saveOrUpdate(MyObject myObj) {
    Session session = sessionFactory.getCurrentSession();
    session.beginTransaction();
    session.saveOrUpdate(myObj);
    session.getTransaction().commit();
}

Stellen Sie außerdem sicher, dass sich die Datei hibernate.cfg.xml im Ordner src/main/resources befindet.

1
Marco