hibernate 的transaction和 session问题

用的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" 为什么?

7个回答

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

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!