在最近的项目中,用户试用的时候发现如果新插入一条数据,在进入列表后打开这条数据就会报错,错误原因我查了下,是因为还没有入库,也就是读到了缓存的数据,我在hibernate中没有使用到二级缓存,隔离级别设置为4,
<property name="hibernate.connection.isolation">4</property>,还是有错。
下面是dao层的数据插入:
public void save(T transientInstance) {
getLog().debug("saving"+getClass().getName() + "instance");
ITransaction tx = TransactionFactory.getTransaction();
try {
tx.begin();
Session session=getSession();
session.save(transientInstance);
session.flush();
session.evict(transientInstance);
tx.commit();
getLog(). debug("save successful");
} catch (RuntimeException re) {
getLog().error("save failed", re);
throw re;
}
}
同志们看看这个到底怎么弄啊?
------解决方案--------------------
你最好一步步debug 下,怀疑你数据库的数据没插入的时候放到集合中,然后前台显示了。
------解决方案--------------------
session.evict(transientInstance);
这句话放在这没意义吧
之后马上commit了
------解决方案--------------------
session.flush(); //flush后hibernate会清理缓存,会将user对象保存到数据库中,将session中的 //insertions中的user对象清除,并且会设置session中的existsInDatabase状态为false
session.evict(user);//从session缓存(EntityEntries属性)中逐出该对象
tx.commit();
//可以成功提交,因为hibernate在清理缓存时,在Session的insertions中集合中无法找到user对象所以不会发出insert语句,也不会更新session中existsInDatabase的状态。但是与commit同时使用,会抛出异常