我应该在调用session.evict(obj)之前提交hibernate事务

时间:2016-02-19 04:52:55

标签: java transactions hibernate-session

保存后我应该何时在休眠中提交事务。是在我调用session.evict(obj)之前或之后。目前我的代码看起来像这样(只需要部分)。

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();
    }

有时如果我在驱逐后提交,则数据不会保存在数据库中。这是编码的正确方法吗?

1 个答案:

答案 0 :(得分:2)

  

方法evict()从Session缓存中删除单个对象。的所以   在调用evict()之前,对象应该在Session中   缓存。因此,如果您第一次保存对象,则必须保存   对象通过Session.save(对象)。后续更新调用应该   按照session.saveOrUpdate(object)或session.update(object)进行操作   在调用evict()从缓存中删除加载的对象之前。(reference

     

来自Hibernate Docs

     

结束会议通常涉及四个不同的阶段:

     
      
  • 刷新会话
  •   
  • 提交交易
  •   
  • 关闭会话
  •   
  • 处理例外
  •   
     

不要使用每个用户会话的反模式会话或   每个应用程序的会话(但是,这种情况很少见   规则)。以下一些问题也可能出现在   推荐的模式,因此请确保您了解其含义   在做出设计决定之前:

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

  •   
  • Hibernate引发的异常意味着   您必须回滚数据库事务并关闭会话   立即(这将在本章后面详细讨论)。   如果你的Session被绑定到应用程序,你必须停止   应用。回滚数据库事务不会把你的   业务对象回到他们刚开始的状态   交易。这意味着数据库状态和业务   对象将不同步。通常这不是问题,因为   异常是不可恢复的,您将不得不重新开始   无论如何都要回滚。

  •   
  • 会话缓存a中的每个对象   持久状态(由Hibernate监视并检查脏状态)。   如果你长时间打开它或者只是加载过多的数据,那就是它   会不断增长,直到你得到一个OutOfMemoryException。 <强>一   解决方案是调用clear()和evict()来管理Session缓存,   但如果您需要海量数据,则应考虑存储过程   操作。
  •