放到缓存中,update,save,load后都放到缓存中.
select 得到数据就是存放在缓存中的数据,update后缓存中存放的对象的属性也变了,好像是当session关闭的时候就flush了,
一但session关闭,缓存也被清空,所以得同步数据库
提交 已修改没有提交到数据库中的数据不知道对不对,一点占印像,还请高手指点

解决方案 »

  1.   

    正在学习hibernate中,如果等下看到了就给你写上来
      

  2.   

    1,hibernate事务提交时会把缓存种数据同步到数据库,session关闭时会再次刷新,再做一次数据库同步
    2,正确。除非显示声明只读事务。否则进行下次查询时要把当前session缓存的对象进行数据库同步
    3。可能是防止并发修改吧
    4,同步当前session缓存的所有对象
      

  3.   


    1.hibernate的事务提交后,是将数据直接持久化到数据库还是只是放在缓存里?
    事务提交后就持久化到数据库了,这跟ORACLE的回滚段一样的;在一个事务中调用一个select语句,如果之前的已经有某个update语句做了数据修改,或是直接改变了对象的属性,则hibernate会在查询语句执行之前首先调用flush()将缓存中的数据同步到数据库,接着才返回查询数据。
    2.以上表述是否正确?

      

  4.   

    Hibernate较典型的问题!!!!!!!!!@@@@
    学学!!!
      

  5.   

    事务提交后是把数据先放到缓存里 然后再同步数据库 就是commit()操作
    在事务中调用一个select语句,之前已经对某个update语句作了修改,如果这个update commit了的话,那么数据库中的记录是修改过的数据。但是select查询的是缓存里的数据。如果update后没有commit 或者是连接没有关闭的话,你这时在select会查询出不同的结果,这是不对的,(这个问题困扰我很长时间)。所以在update后一定要关闭连接。
      

  6.   

    谢谢 大家!!
    “在一个事务中调用一个select语句,如果之前的已经有某个update语句做了数据修改,或是直接改变了对象的属性,则hibernate会在查询语句执行之前首先调用flush()将缓存中的数据同步到数据库,接着才返回查询数据。”
    ----这是“langke93(冬会初雪)”的观点
    意思是一个事务内部select时会清理缓存,然后再查询(是不是直接查询缓存?)“如果update后没有commit 或者是连接没有关闭的话,你这时在select会查询出不同的结果”
    ----lubin83() 的观点select出不同的结果是指什么??是数据库里的数据还是缓存里的数据?
      

  7.   

    “在一个事务中调用一个select语句,如果之前的已经有某个update语句做了数据修改,或是直接改变了对象的属性,则hibernate会在查询语句执行之前首先调用flush()将缓存中的数据同步到数据库,接着才返回查询数据。”经测试 结论正确。
      

  8.   

    Session session = sf.openSession();
    Transaction tran = session.beginTransaction();
    Customer c=(Customer) session.get(Customer.class, new Long(1));
    c.setAge(55);
    session.update(c);

    Session session2 = sf.openSession();
    Transaction tran2 = session2.beginTransaction();
    //会打印一条sql语句,说明是从数据库中取的
    Customer c2=(Customer) session2.get(Customer.class, new Long(1));
    System.out.println(c2.getAge());//查询的是原来没有更新的数据
    tran2.commit();
    System.out.println(c2.getAge());//查询的是原来没有更新的数据
    session2.close();