Java 调用session.execute(obj)之前是否应该提交hibernate事务

Java 调用session.execute(obj)之前是否应该提交hibernate事务,java,transactions,hibernate-session,Java,Transactions,Hibernate Session,保存事务后,在hibernate中何时提交事务。是在我调用session.execute(obj)之前还是之后。目前我的代码看起来是这样的(仅限于必需的部分) Session Session=connector.getSession(); 事务tx=会话.beginTransaction(); 试一试{ Criteria crit=session.createCriteria(ST_CODE_SETTINGS_STORE.class).add(Restrictions.eq(“TYPE”,“is

保存事务后,在hibernate中何时提交事务。是在我调用session.execute(obj)之前还是之后。目前我的代码看起来是这样的(仅限于必需的部分)

Session Session=connector.getSession();
事务tx=会话.beginTransaction();
试一试{
Criteria crit=session.createCriteria(ST_CODE_SETTINGS_STORE.class).add(Restrictions.eq(“TYPE”,“issueno”);
List ls=crit.List();
如果(ls.size()<1){
会话.保存(st_代码\u设置\u存储);
逐出(st_代码_设置_存储);
msg=“插入”;
} 
否则{
长Id=null;
ST\ U代码\设置\存储ST\ U代码\设置\存储1=ls.get(0);
Id=st_code_settings_store1.getCODE_Id();
对象o=session.get(ST_CODE\u SETTINGS\u STORE.class,Id);
ST_代码设置存储更新=(ST_代码设置存储)o;
更新(更新);
}
tx.commit();
}捕获(例外e){
如果(tx!=null){
tx.回滚();
}
System.out.println(“错误:+e.getMessage());
连接器。打印堆栈(e);
投掷e;
}最后{
session.close();
}
有时,如果我在逐出后提交,数据不会保存在数据库中。这是正确的编码方式吗

方法execute()从会话缓存中删除单个对象So 在调用execute()之前,对象应该在会话中 隐藏物因此,如果第一次保存对象,则必须保存 通过Session.save(object)调用对象。后续更新调用应 后续会话。保存或更新(对象)或会话。更新(对象) 在调用execute()从缓存中删除加载的对象之前。()

结束会话通常包括四个不同的阶段:

  • 刷新会话
  • 提交事务
  • 结束会议
  • 处理异常
不要使用每个用户会话的反模式会话或 每个应用程序的会话(但是,很少有例外 规则)。以下一些问题也可能出现在 推荐的模式,因此请确保您理解其含义 在做出设计决策之前:

  • 会话不是线程安全的。同时工作的东西,比如HTTP 请求、会话bean或Swing Worker将导致竞争条件 如果会话实例是共享的。如果您将休眠会话保持在 您的HttpSession(这将在本章后面讨论),您应该 考虑同步对HTTP会话的访问。否则,用户 如果单击“重新加载”的速度足够快,则可以在两次单击中使用相同的会话 并发运行的线程

  • Hibernate方法引发的异常 您必须回滚数据库事务并关闭会话 立即(本章后面将更详细地讨论这一点)。 如果会话已绑定到应用程序,则必须停止 应用回滚数据库事务不会使 业务对象恢复到其在项目开始时的状态 交易这意味着数据库状态和业务 对象将不同步。通常这不是问题,因为 异常是不可恢复的,您必须在之后重新开始 无论如何都要回滚

  • 会话将缓存会话中的每个对象 持久状态(Hibernate监视并检查脏状态)。 如果长时间保持打开状态,或者只是加载了太多数据,那么 将不断增长,直到您获得OutOfMemoryException1 解决方案是调用clear()和execute()来管理会话缓存, 但是如果需要大量数据,则应该考虑存储过程。 行动

参考答案
Session session = connector.getSession();
Transaction tx = session.beginTransaction();
try {
        Criteria crit = session.createCriteria(ST_CODE_SETTINGS_STORE.class).add(Restrictions.eq("TYPE", "issueno"));
        List<ST_CODE_SETTINGS_STORE> ls = crit.list();
        if (ls.size() < 1) {
            session.save(st_code_settings_store);
            session.evict(st_code_settings_store);
            msg = "insert";
        } 
        else {
            Long Id = null;
            ST_CODE_SETTINGS_STORE st_code_settings_store1 = ls.get(0);
            Id = st_code_settings_store1.getCODE_ID();

            Object o = session.get(ST_CODE_SETTINGS_STORE.class, Id);
            ST_CODE_SETTINGS_STORE update = (ST_CODE_SETTINGS_STORE) o;
            session.update(update);
        }
        tx.commit();
    } catch (Exception e) {
        if (tx != null) {
            tx.rollback();
        }
        System.out.println("Error: " + e.getMessage());
        connector.printStack(e);
        throw e;
    } finally {
        session.close();
    }