保存之后,什么时候应该在hibernate中提交一个事务。是在我调用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();
}有时,如果我在驱逐后提交,数据就不会保存在数据库中。这是正确的编码方式吗?
发布于 2016-02-19 05:18:07
evict()方法从会话缓存中删除单个对象。因此,在调用evict()之前,对象应该在会话缓存中。因此,如果第一次保存对象,则必须通过Session.save( object )保存对象。随后的更新调用应该通过session.saveOrUpdate( object )或session.update( object )进行,然后调用evict()从缓存中删除加载的对象。(参考文献) 来自Hibernate文档 会议结束通常涉及四个不同的阶段:
不要使用针对每个用户会话的反模式会话或每个应用程序的会话(但是,这条规则有罕见的例外情况)。在建议的模式中也可能会出现以下一些问题,因此在做出设计决策之前,请确保您了解了这些问题的含义:
https://stackoverflow.com/questions/35497565
复制相似问题