Hibernate:未配置当前Session上下文

35

由于某个愚蠢的错误,我陷入了困境,但无法找到错误的原因!

Hibernate 4.2.6

我参考了此前已经多次提出的这个问题,例如这里

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

-->

Hibernate工具类

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',则会出现以下异常(请注意,即使控制台输出现在比以前多得多) - 是不是版本3.0中没有类'ThreadLocalSessionContext'(我尝试在API中查找,但该网站没有旧的API)?

现在我怀疑dtd - 在执行代码时是否引用了Hibernate 3.0 jars而忽略了本地的jar包,即使指定了SYSTEM?当我在访问受限制的互联网的机器上执行代码时,我遇到了先前的异常(没有当前上下文)。但是当我在我的个人笔记本电脑上执行相同的代码时:

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)
7个回答

65
根据我所知,您的配置不适合当前会话。请更改为
<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


在发布这个问题之前,我参考了类似的帖子,并尝试了两种方法,但都无济于事,问题是其他原因导致的! - Kaliyug Antagonist
@KaliyugAntagonist 当你只写 thread 而不是 org.hibernate.context.ThreadLocalSessionContext 时,你会得到什么异常? - RAS
我已编辑我的帖子 - 我在不同的机器上得到了不同的行为。 - Kaliyug Antagonist
1
在Hibernate教程中指出,“线程”是设计和原型考虑的值,但不适用于生产。因此,我去了Hibernate库(v4.3),发现org.hibernate.context.ThreadLocalSessionContext类不存在。取而代之的是一个对我有用的org.hibernate.context.internal.ThreadLocalSessionContext类。 - Solostaran14
@Solostaran14,感谢您指出这个问题。已更新答案。 - RAS

20
尝试更改
Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 

收件人:

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

9
这解决了问题,但也带来了另一个问题。如果以这种方式使用,为避免打开太多的会话,必须手动关闭会话。 - acsadam0404

4

您需要更改属性:

org.hibernate.context.internal.ThreadLocalSessionContextThread


3

我知道这是一篇旧文章,但以防万一有人像我一样来到这里 - 这个方法可行

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文件夹中。

这仍然存在问题。出现错误 org.hibernate.HibernateException:未配置CurrentSessionContext! - mikebertiean
好的,我不知道发生了什么,因为我看不到完整的堆栈跟踪,但也许这篇文章可以帮助你:https://dev59.com/zGw05IYBdhLWcg3wXQsh - Marco

2
对于 Hibernate 4.x 版本,您需要使用 org.hibernate.context.internal.ThreadLocalSessionContext,而不是 org.hibernate.context.ThreadLocalSessionContext
然而,您可以将属性设置为 thread,而不是 Thread
<property name="hibernate.current_session_context_class">thread</property>

1
尝试更改。
Session session = HibernateUtil.getSessionFactory().getCurrentSession();

到:

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

当前你的回答写得不够明确。请进行[编辑]以添加更多详细信息,以帮助其他人理解这个回答如何回应所提出的问题。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - Community

0

当你写代码时

Session session = HibernateUtil.getCurrentSession();

你在尝试做的是获取一个会话。可以将此与常规的jdbc mysql代码进行比较,其中您首先创建连接conn,然后使用该conn来创建查询。 如果您从未初始化Connection conn变量,会发生什么。 以上代码正在执行该操作。 因此,为了避免这种异常,您需要首先使用以下代码打开会话。
Session session = HibernateUtil.openSession();

一旦您使用了上述代码片段,那么您就可以使用。

Session session = HibernateUtil.getCurrentSession();

注意:避免使用一些答案中提到的getSessionFactory()方法,因为它已经过时了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接