用的SSH框架,事务切到service层, 在service取出一个用户列表,在action中循环此列表修改每个用户的角色id属性为角色名称后 , 数据库就变了呀 !! 在网上搜索了好久 说session关闭的时候会吧持久对象更新到数据库中, 但是自己做了一个例子
Transaction tx = session.beginTransaction(); Query query = session.createQuery("from Test01"); query.setFirstResult(begin); query.setMaxResults(count); List<Test01> l = (List<Test01>)query.list(); for(Test01 u : l){ u.setPwd("1"); } tx.commit(); for(Test01 u : l){ System.out.println(u); u.setPwd("22222"); session.update(u); } session.flush(); session.close();
修改后数据库中 pwd却是"1" 不是"22222" 为什么?
tx.commit();执行后,List l = (List)query.list(); 实体集就成了离游态了。原先是持久态的。
session.flush(),只能持久态的实体起作用。
你这个更新后的事物没有提交,所以还是1
你写的这个例子虽然实现了更改,但是并没有提交事务,所以是不会持久化到数据库中的
你上面的代码逻辑是没有问题的,因为你是手动开启的事物然后你更新PWD=1
然后提交事物,如果你打断点观察 当你commit的时候hibernate会发出SQL语句同时提交事物,现在数据库里的值就是1了
然后你有更新了pwd=222 这里数据库是不会变的 因为hibernate的save,update,delete是需要事物的,你更新pwd=222跟们没在事物中进行,所以会发出SQL 但是没提交事物 所里当执行完毕后 数据库当中不会发生变化.
也就是说 你setPwd=222 hibernate做了更新 但是没包含在事物当中 所以数据库不会变
至于你说用SSH会改变 如果你事物放在Service 按理说在action当中修改不会影响到数据库了,可能是你事物配置的不对,看不见你代码 就不好下结论了
你最后的这个更新,明显没有提交事务,你在倒数第二行前,加一行tx.commit();数据库里面就肯定是22222了,老兄以后看代码仔细点!
倒数第二行前线commit下就行了 别着急,休息,休息一会
嘻嘻 看到我原来的影子了 提交之后再修改 修改不提交事务 :D