2013-11-28 21 views
16

मैं कहीं कुछ मूर्खतापूर्ण गलती के कारण अटक गया हूं लेकिन पता लगाने में सक्षम नहीं है!हाइबरनेट: कोई CurrentSessionContext कॉन्फ़िगर नहीं

हाइबरनेट 4.2.6

मैं इस सवाल करने के लिए भेजा है, कई बार पूछा कि पहले, उदाहरण के 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> 


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

} 

जब भी मैं इस प्रयास करें:

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

मैं:

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) 

मेरी व्यक्तिगत लैपटॉप पर क्रियान्वित करने के बाद संपादित

  1. कोड ठीक है, तो मैं 'धागा' का उपयोग चलाता है सीएफजी फ़ाइल में
  2. यदि मैं 'थ्रेडलोकल सत्र कॉन्टेक्स्ट' का उपयोग करता हूं, तो मैं ge नीचे दिए गए अपवाद (कृपया ध्यान दें कि कंसोल पर आउटपुट अब भी पिछले रन से बड़ा है) - क्या यह है कि कक्षा 'थ्रेडलोकल सत्र कॉन्टेक्स्ट' कक्षा संस्करण में मौजूद नहीं थी (मैंने एपीआई में खोजने की कोशिश की लेकिन साइट पुराने API का उपयोग)

अब मैं DTD के बारे में संदिग्ध हूँ नहीं है - भले ही प्रणाली निर्दिष्ट किया जाता है, हाइबरनेट 3.0 जार कहीं संदर्भित किया जा रहा है, जबकि स्थानीय लोगों को नजरअंदाज कर दिया जाता है? प्रतिबंधित इंटरनेट एक्सेस वाली मशीन पर कोड निष्पादित करते समय मुझे पिछले अपवाद (कोई वर्तमान संदर्भ नहीं मिला)। लेकिन जब मैं अपने निजी लैपटॉप पर ही मार डाला:

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) 

उत्तर

8

कोशिश बदलते

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

रहे हैं:

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

यह समस्या हल करती है लेकिन एक और को जन्म देती है। अगर इस तरह इस्तेमाल किया जाता है तो सत्र को कई खुले सत्रों से बचने के लिए मैन्युअल रूप से बंद किया जाना चाहिए। – adam0404

41

मेरी जानकारी के अनुसार, आपके विन्यास नहीं के लिए उचित है वर्तमान सत्र। , विशेष रूप से

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

अंतिम अनुच्छेद के अंतिम लाइनों पढ़ें:

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

उपयोग

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

इस बारे में अधिक जानकारी के लिए करने के बजाय, कृपया इस लिंक पर जाएं।

उन लोगों के लिए जो हाइबरनेट 4 का उपयोग कर रहे हैं।1,

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

संदर्भ: https://docs.jboss.org/hibernate/orm/4.1/javadocs/org/hibernate/context/internal/ThreadLocalSessionContext.html

+0

इस प्रश्न को पोस्ट करने से पहले, मैंने इसी तरह के पदों का उल्लेख किया था और व्यर्थ में दोनों तरीकों की कोशिश की थी, मुद्दा कुछ और है! –

+0

@ kaliyugAntagonist जब आप 'org.hibernate.context.ThreadLocal सत्र कॉन्टेक्स्ट' के बजाय केवल 'थ्रेड' लिखते हैं तो आपको क्या अपवाद मिलता है? – RAS

+0

मैंने अपनी पोस्ट संपादित की है - मुझे विभिन्न मशीनों पर अलग-अलग व्यवहार मिल रहा है। –

4

आप अपनी संपत्ति को बदलने की जरूरत:

org.hibernate.context.internal.ThreadLocalSessionContext को थ्रेड

+0

थ्रेड, थ्रेड – rberla

1

मुझे पता है यह एक पुरानी पोस्ट है, लेकिन अगर कोई यहां आए जैसा मैंने किया - यह मैं काम कर रहा है:

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

} 

अब इस आह्वान करने के लिए काफी सरल है:

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

और अगले कदम bellow की तरह कुछ होगा:

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

इसके अलावा कि hibernate.cfg सुनिश्चित करें .xml src/main/संसाधन फ़ोल्डर में है।

+0

में अभी भी समस्याएं हैं। त्रुटि प्राप्त हो रही है। hibernate.HibernateException: कोई CurrentSessionContext कॉन्फ़िगर नहीं किया गया है! – mikebertiean

+0

ठीक है, पता नहीं क्या हो रहा है क्योंकि मैं पूर्ण स्टैक ट्रेस नहीं देख सकता लेकिन शायद यह पोस्ट आपकी मदद करेगा: http://stackoverflow.com/questions/7281045/why-do-i-get-org-hibernate -hibernateexception-नो-currentsessioncontext-configur – Marco

1

हाइबरनेट 4.x के लिए आप org.hibernate.context.internal.ThreadLocalSessionContext बजाय org.hibernate.context.ThreadLocalSessionContext उपयोग करने के लिए की जरूरत है।

हालांकि, अगर आप सिर्फ धागा और नहीं थ्रेड के गुण सेट कर सकते हैं।

<property name="hibernate.current_session_context_class">thread</property> 
संबंधित मुद्दे