一尘不染

为什么我得到org.hibernate.HibernateException:没有配置CurrentSessionContext

hibernate

我正在编写一个简单的项目,一个使用Swing编写的业务应用程序,它使用Hibernate作为后端。我来自Spring,这为我提供了使用hibernate和事务的简便方法。无论如何,我设法让Hibernate工作。昨天,在编写一些代码从数据库中删除bean的同时,我得到了以下信息:

org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions

删除代码很简单:

    Session sess = HibernateUtil.getSession();
    Transaction tx = sess.beginTransaction();
    try {
        tx.begin();
        sess.delete(ims);
    } catch (Exception e) {
        tx.rollback();
        throw e;
    }
    tx.commit();
    sess.flush();

我的HibernateUtil.getSession()是:

    public static Session getSession() throws HibernateException {
        Session sess = null;
        try {
            sess = sessionFactory.getCurrentSession();
        } catch (org.hibernate.HibernateException he) {
            sess = sessionFactory.openSession();
        }
        return sess;
    }

其他详细信息:仅在关闭应用程序时,我才会在代码中关闭hibernate会话。这是错的吗?为什么我在删除时得到此信息(仅适用于该bean,其他人可以使用),而我不执行其他操作(插入,查询,更新)?

我四处阅读,尝试在中getSession简单地修改我的方法sessionFactory.getCurrentSessionCall(),但得到了:org.hibernate.HibernateException: No CurrentSessionContext configured!

Hibernat conf:

<hibernate-configuration>
    <session-factory >
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost/joptel</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">******</property>
    <property name="hibernate.connection.pool_size">1</property>
    <property name="show_sql">true</property>
    <property name="hibernate.hbm2ddl.auto">update</property>


    ..mappings..

    </session-factory>
</hibernate-configuration>

阅读 225

收藏
2020-06-20

共1个答案

一尘不染

我想问你一件事,为什么要尝试使用“ OpenSession”方法?

public static Session getSession() throws HibernateException {         
   Session sess = null;       
   try {         
       sess = sessionFactory.getCurrentSession();  
   } catch (org.hibernate.HibernateException he) {  
       sess = sessionFactory.openSession();     
   }             
   return sess;
}

您不必调用openSession(),因为getCurrentSession()method始终返回当前会话(如果已将其配置为,则返回Thread)。

我明白了!…您必须在hibernate.cfg.xml文件中指定当前上下文

它应该是:

<property name="hibernate.current_session_context_class">thread</property>
2020-06-20