我们应该在哪里使用commit(session),在try或finally中?

时间:2015-03-03 07:01:24

标签: java hibernate exception try-catch

如果我想在成功执行数据库操作后使用commit(session),那么最好将它放在try或finally块中? 在这里我最终使用它,它应该在尝试吗?

public void delete( --- ) {
    Session session = init();
    try {
        ----
    } catch (HibernateException e) {
        rollback(session);
        logger.error("delete failed", e);
        throw e;
    } finally {
        commit(session);
        close(session);
    }
}

4 个答案:

答案 0 :(得分:5)

应该在try,原因有两个:

  • 如果某个例外或错误其他而不是commit,您将HibernateException会话,并且您几乎肯定不想这样做
  • 致电commit后,您将致电rollback。我不记得Hibernate是否允许你这样做(通过默默地忽略回滚),但至少它是丑陋的。每个会话要么 回滚。

这里的常规解决方案是保留一个单独的boolean变量,该变量在您成功提交时设置,并在finally中检查,必要时回滚:

boolean committed = false;
try {
    // Do stuff
    commit(session);
    committed = true;
} catch (HibernateException e) {
    logger.error("delete failed", e);
    throw e;
} finally {
    if (!committed) {
        rollback(session);
    }
    // TODO: This won't execute if rollback fails.
    // Check whether that's a problem.
    close(session);
}

答案 1 :(得分:0)

应该在tryfinally之后也会调用catch

答案 2 :(得分:0)

绝对应该放在try块中。 finally块通常仅用于关闭任何连接。

答案 3 :(得分:0)

你需要将它放在try块中,否则你将无法识别任何错误而你无法回滚