java - 调用 SessionFactory.getCurrentSesion() 时会发生什么

标签 java hibernate struts2

我在 DAO 中使用 Session session=SessionFactory.getCurrentSssion() 方法作为我的 Struts2 应用程序中的类级别变量。我在struts拦截器类中维护Transaction。在 5 月份的 DAO 类中,当我尝试从数据库获取数据时,有时会出现“ session 关闭”异常。在我的 saveOrUpdate() 方法代码中,我处理 Hibernate 异常。在 catch block 中,我回滚事务。

请帮助我,如果我使用 getCurrentSession() 方法回滚事务时会发生什么。

最佳答案

您正在使用 Hibernate 的 SessionFactory.getCurrentSession(),它用于创建新 session 并且它由 Hibernate 自动管理。这意味着当您调用 getCurrentSession() 时,Hibernate 将此 session 与本地线程绑定(bind),如果您在 hibernate.cfg.xml 文件中设置 hibernate.current_session_context_class 属性,则可以在任何地方访问该 session 。此属性将您当前的 session 绑定(bind)到本地线程。

Since, you are using getCurrentSession() method instead of openSession(), your session 
will closed automatically by Hibernate as soon you perform any operation on database &
commit the transaction.

例如,

Session session = sessionFactory.getCurrentSession();
Transaction transaction = session.beginTransaction();
Student student = new Student();
...
session.save(student);
transaction.commit();

要从此错误中恢复,您应该在需要时使用 sessionFactory.openSession() 方法创建 session 。 通过这样做,您可以完全控制 session 对象。>

例如,

Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
try {
    // do something
    transaction.commit();
} catch (Exception ex) {
    // on error, revert changes made on DB
    if (transaction != null) {
        transaction.rollback();
    }
} finally {
    session.close();
}

更多信息:

  1. 你有个好主意Hibernate openSession() vs getCurrentSession()
  2. 您可以在 Hibernate 中创建托管 session 。看看这个ManagedSessionContext (Hibernate JavaDocs)

回滚事务时会发生什么?

When you call rollback() method of Transaction it will revert all current changes done
on database. It doesn't have any concern with closing Hibernate session.

关于java - 调用 SessionFactory.getCurrentSesion() 时会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26274360/

相关文章:

java - Struts 2 如果-否则-如果

error-handling - Struts2 2.0.x版处理未知操作

java - OpenGL 有纹理的四边形和无纹理的四边形

java - 是否可以判断请求JSON中是否存在参数

java - 如何反转字节数组中的 UTF-8 编码?

java - 当内容超过 141 个字符时,VARCHAR 列会安静地中断 Hibernate

java - Hibernate:具有两个表的多对一映射

java - 制作 Java GWT Web 项目安装程序?

java - 在 Hibernate 中使用实体作为 DTO

java - Struts2:URL Action 相对路径