首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >应该在调用session.evict(obj)之前提交hibernate事务吗?

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

Stack Overflow用户
提问于 2016-02-19 04:52:55
回答 1查看 1.5K关注 0票数 3

保存之后,什么时候应该在hibernate中提交一个事务。是在我调用session.evict(obj)之前还是之后。目前,我的代码看起来是这样的(只是必需的部分)。

代码语言:javascript
复制
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();
    }

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-19 05:18:07

evict()方法从会话缓存中删除单个对象。因此,在调用evict()之前,对象应该在会话缓存中。因此,如果第一次保存对象,则必须通过Session.save( object )保存对象。随后的更新调用应该通过session.saveOrUpdate( object )或session.update( object )进行,然后调用evict()从缓存中删除加载的对象。(参考文献) 来自Hibernate文档 会议结束通常涉及四个不同的阶段:

  • 冲洗会话
  • 提交事务
  • 关闭会话
  • 处理异常

不要使用针对每个用户会话的反模式会话或每个应用程序的会话(但是,这条规则有罕见的例外情况)。在建议的模式中也可能会出现以下一些问题,因此在做出设计决策之前,请确保您了解了这些问题的含义:

  • 会话不是线程安全的。并发工作的东西,如HTTP请求、会话bean或Swing工作人员,如果共享会话实例,将导致争用条件。如果将Hibernate会话保留在HttpSession中(这将在本章后面讨论),则应该考虑同步对Http会话的访问。否则,单击“重新加载”足够快的用户可以在两个并发运行的线程中使用相同的会话。
  • Hibernate引发的异常意味着您必须回滚数据库事务并立即关闭会话(本章后面将对此进行更详细的讨论)。如果会话绑定到应用程序,则必须停止应用程序。回滚数据库事务不会使您的业务对象回到事务开始时的状态。这意味着数据库状态和业务对象将不同步。通常这不是一个问题,因为异常是不可恢复的,而且您必须在回滚之后重新开始。
  • 会话缓存处于持久状态的每个对象(Hibernate监视和检查脏状态)。如果您将它打开了很长时间,或者只是加载了太多的数据,那么它将无休止地增长,直到您得到一个OutOfMemoryException。的一种解决方案是调用clear()和evict()来管理会话缓存,但是如果需要大量数据操作,则应该考虑存储过程。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35497565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档