环境:我是用hibernate框架 oracle10g数据库 MyEclipse6.0起因:对一个对象进行了update操作。DAO:

    public boolean update( Long id, String message ){
try {
Reaction reaction = findById(id);

reaction.setReactioncontent(message);
getSession().update(reaction);

return true;
} catch (RuntimeException re) {
System.out.println("sdaf");
return false;
}
    }servlet:
    ReactionDAO dao = new ReactionDAO();
    dao.update(id, message);
    dao.getSession().beginTransaction().commit();
    dao.getSession().flush();
    dao.getSession().close();
问题:
      该对象数据库中已经保存,PL/SQL可以查到。      但再用dao进行查询时,有时候显示更新了,有时显示没有更新。       重启tomcat,就全部更新了,不再有这个问题。小弟不明白,是不是update以后,数据到底保存到哪里去了?怎么数据库可以查得到,但是DAO不是每次都能查到?
我这个bug这么解决?

解决方案 »

  1.   

    在查询方法里面session clear一下看看
      

  2.   

    要在同一个session中开启事务和提交事务。public boolean update( Long id, String message ){
        try {
            Session sesion = getSession();
            Transaction tx = sesion.beginTransaction();
            Reaction reaction = findById(id);
                
            reaction.setReactioncontent(message);
            tx.commit();
            return true;
        } catch (RuntimeException re) {
            System.out.println("sdaf");
            return false;
        }
        }
      

  3.   

    是不是你查询的方式有问题,比如只到session缓存中查,没去数据库查……
      

  4.   

    Reaction reaction = findById(id);改为:
    Reaction reaction = Load(id);
    find的形式没有使用延迟加载
      

  5.   

    要在update方法中配置事物啊 
      

  6.   

      dao.update(id, message);//update方法没有开启事务
      dao.getSession().beginTransaction().commit();//此处开启事务并提交,中间没有任何处理逻辑,
        dao.getSession().flush();//此处事务已经提交,而且里面没有持久化对象flush没有任何意义
        dao.getSession().close();
       
      

  7.   

    session clear()是干嘛?dao里的findAll()到底是去哪里查找?缓存、内存、磁盘?update应该不用开始事务吧?小弟还是菜鸟?继续等待高手、、、
      

  8.   

    session.clear()将Session对象里的键和值清空
    session.flush()可以强制进行从内存到数据库的同步
    session.find()实际上是无法利用缓存的,它对缓存只写不读。3版本以后已经被get()取代了
    update需要开始事务
      

  9.   

    建议你可以做下实验、可以参考Hibernate自带的参考文档很不错的