保存后我应该何时在休眠中提交事务。是在我调用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();
}
有时如果我在驱逐后提交,则数据不会保存在数据库中。这是编码的正确方法吗?
答案 0 :(得分:2)
方法evict()从Session缓存中删除单个对象。的所以 在调用evict()之前,对象应该在Session中 缓存。因此,如果您第一次保存对象,则必须保存 对象通过Session.save(对象)。后续更新调用应该 按照session.saveOrUpdate(object)或session.update(object)进行操作 在调用evict()从缓存中删除加载的对象之前。(reference)
结束会议通常涉及四个不同的阶段:
- 刷新会话
- 提交交易
- 关闭会话
- 处理例外
不要使用每个用户会话的反模式会话或 每个应用程序的会话(但是,这种情况很少见 规则)。以下一些问题也可能出现在 推荐的模式,因此请确保您了解其含义 在做出设计决定之前:
会话不是线程安全的。同时工作的东西,比如HTTP 请求,会话bean或Swing worker将导致竞争条件 如果共享会话实例。如果你保持你的Hibernate会话 你的HttpSession(这将在本章后面讨论),你应该 考虑同步访问您的Http会话。否则,用户 点击重新加载足够快可以使用两个相同的会话 并发运行线程。
Hibernate引发的异常意味着 您必须回滚数据库事务并关闭会话 立即(这将在本章后面详细讨论)。 如果你的Session被绑定到应用程序,你必须停止 应用。回滚数据库事务不会把你的 业务对象回到他们刚开始的状态 交易。这意味着数据库状态和业务 对象将不同步。通常这不是问题,因为 异常是不可恢复的,您将不得不重新开始 无论如何都要回滚。
- 会话缓存a中的每个对象 持久状态(由Hibernate监视并检查脏状态)。 如果你长时间打开它或者只是加载过多的数据,那就是它 会不断增长,直到你得到一个OutOfMemoryException。 <强>一 解决方案是调用clear()和evict()来管理Session缓存, 但如果您需要海量数据,则应考虑存储过程 操作。