hibernate hibernate-mapping hibernate-4.x

Hibernate: No CurrentSessionContext configurado



hibernate-mapping hibernate-4.x (5)

Estoy atascado debido a algún error tonto en algún lugar pero no puedo entenderlo!

Hibernate 4.2.6

Me he referido a esta pregunta, formulada varias veces anteriormente, por ejemplo here

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; } }

Cada vez que intento esto:

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

Yo obtengo :

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)

Editado después de ejecutarlo en mi laptop personal.

  1. El código funciona bien si uso ''hilo'' en el archivo cfg
  2. Si uso ''ThreadLocalSessionContext'', obtendré la siguiente excepción ( tenga en cuenta que incluso la salida en la consola ahora es enorme que la ejecución anterior ). buscar en la API pero el sitio no tiene la API anterior )

Ahora desconfío del dtd: ¿se está haciendo referencia a los jars de Hibernate 3.0 en algún lugar mientras que los locales se ignoran, aunque se especifique SYSTEM? Obtuve la excepción anterior (sin contexto actual) mientras ejecutaba el código en una máquina con acceso restringido a Internet. Pero cuando lo ejecuté en mi portátil personal:

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)


Intenta cambiar

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

a :

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


Necesita cambiar su propiedad:

org.hibernate.context.internal.ThreadLocalSessionContext a Thread


Para hibernate 4.x debe usar org.hibernate.context.internal.ThreadLocalSessionContext en lugar de org.hibernate.context.ThreadLocalSessionContext

Sin embargo, solo puede establecer la propiedad a thread y no a Thread .

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


Sé que este es un post antiguo, pero en caso de que alguien venga aquí como lo hice, esto está funcionando :

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; } }

Ahora invocar esto es bastante simple:

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

Y el siguiente paso sería algo como bramido:

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

También asegúrese de que hibernate.cfg.xml esté en la carpeta src / main / resources.


Según mi conocimiento, su configuración no es adecuada para la sesión actual. En lugar de

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

utilizar

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

Para más información sobre esto, visite este enlace:

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

Especialmente, lea las últimas líneas del último párrafo.

Para aquellos que están usando Hibernate 4.1,

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

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