我先情况说一下:以下简写
openSession
new Transaction
  从数据库取得值到ObjectA的一个list,且设为只读
Transaction.commit更改list.get[0],对象中的一些属性,如本来name为lili的现在改为meimeiopenSession
  从数据库取得值到ObjectA的一个list,且设为只读,且identifier“主键”(不知道用什么中文好)同之前的一样
Transaction.commit此时发现name依然为meimei(因为我设置了只读,数据库也确实没改变,为lili,但取出来的值却是meimei)

解决方案 »

  1.   

    你修改了list.get[0],就应该直接update的list.get[0]。你再去数据库读取一次,然后再更新,肯定不会变啊!!!
      

  2.   

    我不update是有原因的,因为我还想要objectA实体去做一些临时的数据转换,而这些转换后的临时数据我不想保存到DB中去但我又有下一次再去取得“原始数据”的需要(就是取不到了“原始数据”)怀疑是hibernate做了什么手脚,呵呵
      

  3.   

    去看看Hibernate 的缓存那一章的东东吧
      

  4.   

    嗯,我也大概是知道是那一章里面的事,呵呵,只是一下子看不下来,先来问问看,有没有很熟悉的朋友,就顺手告诉我算了,因为我把二级缓存设为false也不行
      

  5.   

    你数据库的主键是代理主键(OID) 还是自然主键,你要是用NAME做为表的主键(自然主键)就会出现你这种情况,
    数据库与内存里面数据不能同步更新
      

  6.   

    openSession
    new Transaction
      从数据库取得值到ObjectA的一个list,且设为只读
    Transaction.commit更改list.get[0],对象中的一些属性,如本来name为lili的现在改为meimei在这里添加关闭会话的代码openSession
      从数据库取得值到ObjectA的一个list,且设为只读,且identifier“主键”(不知道用什么中文好)同之前的一样
    Transaction.commit 
      

  7.   

    哦,呵呵,我写错了一点东西
    我先情况说一下:以下简写
    openSession
    new Transaction
      从数据库取得值到ObjectA的一个list,且设为只读
    Transaction.commit更改list.get[0],对象中的一些属性,如本来name为lili的现在改为meimeinew Transaction***********************之前写错了
      从数据库取得值到ObjectA的一个list,且设为只读,且identifier“主键”(不知道用什么中文好)同之前的一样
    Transaction.commit此时发现name依然为meimei(因为我设置了只读,数据库也确实没改变,为lili,但取出来的值却是meimei) 
      

  8.   


    嗯,是这样的,主键就是对应数据表中的userid(我也分不清是代理还是自然主键,呵呵)“数据库与内存里面数据不能同步更新”假如是这种情况有没有什么方便的解决办法让他同步更新
    还有,确实再重新close-openSession可以解决问题,但这样我觉得性能上有点说不过去
      

  9.   

    是这样得到的:list<ObjectA> = query.list();
    //这时其实只返回了一个objectA对象,也就是本来可以用query.uniqueResult();只是为了通用用了list()方法然后我再这样得到objectA 
    ObjectA objectA = (ObjectA)list.get(0);
      

  10.   


    get()方法,先看缓存里有没有,有就用缓存里的,没有才从数据库里加载。
    使用HQL,直接从数据库加载,而不管缓存里有没有现成的。
      

  11.   

    “使用HQL”具体怎么样?,我觉得我本来就应该是用了HQL了?而且,我试过这个:setCacheMode(CacheMode.IGNORE)也不行我觉得它不是缓存的原因,而是它用的就是之前的objectA对象
      

  12.   

    list <ObjectA> = query.list();
    //这时其实只返回了一个objectA对象,也就是本来可以用query.uniqueResult();只是为了通用用了list()方法然后我再这样得到objectA
    ObjectA objectA = (ObjectA)list.get(0); 在这里仍然应该使用query.list();
      

  13.   

    是这样吗?ObjectA objectA = (ObjectA)query.list().get(0); //这个仍然不行,我试过
    还是Object A object A = (ObjectA)query.uniqueResult(); //如果是这个的话,又不满足方法接口的需要了
      

  14.   

    然后我再这样得到objectA
    ObjectA objectA = (ObjectA)list.get(0); 
      

  15.   

    最终还是要自已看完书了才知道几个勉强的可以用evict(),这个可以仅分离要分离的对象,就是对象多了可能不太好
    reflesh(),重新到DB更新一下,导致其它的不是同一ID的也要更新,更不好
    还可以用session.clear()。简直就是不要让Hibernate用缓存功能了,不过有时缓存真的没多大用处性能方面都不是很理想,还是觉得前一个好用一点