求助:hibernate脏数据的问题,请高手解答 我从数据库中取得该持久对象后,改变了属性aa的值(只是改变缓存中的值),但是在后续的流程操作中,我需要最原始的属性aa的值,也就是数据库中A的属性aa的值.这句有点问题.你要用到的是aa原值,也就是数据库的值.耍你又从数据库中取得了这个值并修改了aa的值.这两个值不是一个吗 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 111Service.javapublic 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又是我需要后续保存的值 ...}明白? 不知道你的事务控制是如何实现的,如果是真对servie的方法来做的话,那么你在load出来对象的时候,对象的状态为持久态,你对它的任何改变都会被写进数据库,只要事务提交的时候就会写。所以说你的objA.setAa("2")和 objA.getAa(); 都是在对数据库读写数据,按理说执行objA.getAa(); 的时候,第一个方法public void doSth()所在的事务并没有提交,但为了保持数据的一致性,hibernate在你get之前,set方法就被持久化了。这就是你get到最新数据的原因了。 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); ...} 你可一将开始的植存到session中呀 你理解错我的意思了。get是不会持久化数据的,set会,前提是你的数据处于持久太。也就是session没有close,flush的时候。当你get数据时,为了保证数据的准确性,(不让你get到脏数据),你的set方法会被提交。换句话说: 你的set和get方法分别属于两个事务(在两个方法中,每一个方法调用之前会打开一个事务),当你get请求时,set所在的事务会提交。这样,你get到的数据就是更改后的数据。你可以测试一下:设断点到你的get方法哪里。然后运行的时候,查看数据库,你会发现,你set后的数据已经被持久化了。 111Service.javapublic 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又是我需要后续保存的值 ...} mysql怪事 mysql 连续查询10次左右就假死,用struts+spring+hibernet 用的spring 里自带的hibernet的方法 关于Hibernate 的一个SUM()输出问题 oracle中一个查询问题? JDBC问题 ssh在action中执行不了hibernate的删除 请指出该代码的错误,感激不尽,请帮帮新人 源代码J2EE黄金组合 Tomcat 4.x+JBoss 3.x+MySQL 3.x(MAX)+Eclipse 推荐几本EJB方面的经典书籍 奇怪的问题(特急,在线等!) Hibernate的入门问题 导入问题
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又是我需要后续保存的值
...
}明白?
{
evict(objA)
A1 newObjA = load(A.class, objA.ID, LockMode.update);
String aa = newObjA.getAa(); //此时我想要的是aa原始的值11做判断用,而非修改后的值2,但2又是我需要后续保存的值
...
merge(objA);
...
}
换句话说: 你的set和get方法分别属于两个事务(在两个方法中,每一个方法调用之前会打开一个事务),当你get请求时,set所在的事务会提交。这样,你get到的数据就是更改后的数据。你可以测试一下:
设断点到你的get方法哪里。然后运行的时候,查看数据库,你会发现,你set后的数据已经被持久化了。
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又是我需要后续保存的值
...
}