我从数据库中取得该持久对象后,改变了属性aa的值(只是改变缓存中的值),但是在后续的流程操作中,我需要最原始的属性aa的值,也就是数据库中A的属性aa的值.这句有点问题.你要用到的是aa原值,也就是数据库的值.耍你又从数据库中取得了这个值并修改了aa的值.这两个值不是一个吗

解决方案 »

  1.   

    111Service.java
    public void doSth()

      A objA = load();从数据库中获得 aa的值是11
      objA.setAa("2");修改属性aa的值
      222Service.doSth2(objA);
    ...
    }-------------------------------------------------
    222Service.javapublic void doSth2(A objA)

      String aa = objA.getAa(); //此时我想要的是aa原始的值11做判断用,而非修改后的值2,但2又是我需要后续保存的值
      ...
    }明白?
      

  2.   

    不知道你的事务控制是如何实现的,如果是真对servie的方法来做的话,那么你在load出来对象的时候,对象的状态为持久态,你对它的任何改变都会被写进数据库,只要事务提交的时候就会写。所以说你的objA.setAa("2")和 objA.getAa(); 都是在对数据库读写数据,按理说执行objA.getAa(); 的时候,第一个方法public void doSth()所在的事务并没有提交,但为了保持数据的一致性,hibernate在你get之前,set方法就被持久化了。这就是你get到最新数据的原因了。
      

  3.   

    To xiaoqulai(肖曲来):象我开始说的在doSth2中加了如下操作,但仍然不起作用,你的意思是我取得的newObjAobjA.getAa(); 也会为了保持数据的一致性set方法被持久化,请指教,谢谢   222Service.javapublic void doSth2(A objA)

      evict(objA)
      A1 newObjA = load(A.class, objA.ID, LockMode.update);
        String aa = newObjA.getAa(); //此时我想要的是aa原始的值11做判断用,而非修改后的值2,但2又是我需要后续保存的值
      ...
      merge(objA);
      ...

      

  4.   

    你可一将开始的植存到session中呀
      

  5.   

    你理解错我的意思了。get是不会持久化数据的,set会,前提是你的数据处于持久太。也就是session没有close,flush的时候。当你get数据时,为了保证数据的准确性,(不让你get到脏数据),你的set方法会被提交。
    换句话说: 你的set和get方法分别属于两个事务(在两个方法中,每一个方法调用之前会打开一个事务),当你get请求时,set所在的事务会提交。这样,你get到的数据就是更改后的数据。你可以测试一下:
    设断点到你的get方法哪里。然后运行的时候,查看数据库,你会发现,你set后的数据已经被持久化了。
      

  6.   

    111Service.java
    public void doSth()

      A objA = load();从数据库中获得 aa的值是11
      A objB = load();//重新定义一个。
      objA.setAa("2");修改属性aa的值
      222Service.doSth2(objA);
    ...
    }-------------------------------------------------
    222Service.javapublic void doSth2(A objA)

      String bb = objB.getAa();
      String aa = objA.getAa(); //此时我想要的是aa原始的值11做判断用,而非修改后的值2,但2又是我需要后续保存的值
      ...