没有活动事务,Hibernate SessionFactory getCurrentSession无效

时间:2012-10-10 10:55:42

标签: java hibernate

我在Hibernate中面临一个问题。这是代码。

    Configuration cfg = new Configuration().configure();
    SessionFactory factory = cfg.buildSessionFactory();
    Session session = factory.openSession();

    Transaction trans = session.beginTransaction();
    trans.begin();
    Session session2 = factory.getCurrentSession();
    System.out.println(session2.isConnected());

    trans.commit();

在我的cfg文件中

  <session-factory>
    <property name="hibernate.connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
    <property name="hibernate.connection.url">jdbc:sqlserver://localhost:1433</property>
    <property name="hibernate.connection.username">username</property>
    <property name="connection.password">password</property>
    <property name="connection.pool_size">5</property>
    <property name="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property>
    <property name="hibernate.current_session_context_class">thread</property>
    <property name="show_sql">true</property>
    <property name="hbm2ddl.auto">false</property>
    <mapping resource="Test.hbm.xml"/>
</session-factory>

当我使用上面的代码运行应用程序时,它给了我一个异常说“org.hibernate.HibernateException:isConnected在没有活动事务的情况下无效”

我不知道它在内部表现的行为。请问任何想法。

1 个答案:

答案 0 :(得分:2)

如果你看一下SessionFactory.html#getCurrentSession

的Java文档
  

获得当前会话。究竟“当前”的定义意味着由配置使用的CurrentSessionContext impl控制。

因此,您的sessionsession2是两个不同的会话。因此,您必须在session2上启动交易才能访问isConnected()

但是,如果您使用getCurrentSession()检索第一个会话,那么第二次getCurrentSession()将返回相同的实例。

Session session = factory.getCurrentSession();//Use getCurrentSession rather than openSession
Transaction trans = session.beginTransaction();
trans.begin();

Session session2 = factory.getCurrentSession();//Same session will be returned.

System.out.println(session2.isConnected());
trans.commit();