Hibernate:没有配置CurrentSessionContext

时间:2013-11-28 11:48:28

标签: hibernate hibernate-mapping hibernate-4.x

我因某些愚蠢的错误而陷入困境但却无法弄明白!

Hibernate 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>

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

}

每当我尝试这个:

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. 如果我在cfg文件中使用'thread',代码运行正常
  2. 如果我使用'ThreadLocalSessionContext',我会得到以下异常(请注意,即使控制台上的输出现在也比之前的运行还要大) - 是否类'ThreadLocalSessionContext'是不存在于3.0版本中(我试图在API中找到但该网站没有旧的API
  3. 现在我对dtd持怀疑态度 - 即使指定了SYSTEM,Hibernate 3.0 jar也会被忽略,而本地的jar被忽略了?在具有受限Internet访问的计算机上执行代码时,我得到了上一个异常(没有当前上下文)。但是当我在我的个人笔记本电脑上执行相同操作时:

    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)
    

5 个答案:

答案 0 :(得分:53)

据我所知,您的配置不适合当前会话。而不是

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

使用

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

有关此内容的更多信息,请访问此链接:

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

特别是,请阅读最后一段的最后一行。

对于那些使用Hibernate 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

答案 1 :(得分:15)

尝试更改

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

到:

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

答案 2 :(得分:4)

您需要更改您的财产:

<强> org.hibernate.context.internal.ThreadLocalSessionContext 至 的螺纹

答案 3 :(得分:2)

对于hibernate 4.x,您需要使用 org.hibernate.context.internal.ThreadLocalSessionContext 而不是 org.hibernate.context.ThreadLocalSessionContext

但是,您只需将该属性设置为主题,而不是 主题

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

答案 4 :(得分: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();

接下来的步骤就像是吼叫:

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

还要确保hibernate.cfg.xml位于src / main / resources文件夹中。