我的问题是:已经在配置文件配置了事务自动提交,save方法有效,为什么执行update还得再手动提交事务?????先来看一下问题的现象
在hibetnate的配置了autocommit为true,如下:
执行save方法的时候没有问题,可以保存到数据库。代码如下:
但是在执行update时,数据库却没有更改成功,代码如下:
在进行了手动提交事务后,数据库才操作成功,
数据库数据:
再次发出疑问:已经在配置文件配置了事务自动提交,save方法有效,为什么执行update还得再手动提交事务?????
经过同事杨帅哥的解答,对这个问题有了清清晰的认识,如有不准确的地方,请批评指正。现解答如下:因为在配置文件中设置了事务的自动提交为true,所以save方法正确执行。在进行更新和删除。需要先找到某条数据:User u = (User) session.get(User.class, 7),找到的这条数据缓存到了session中,那么接下来的update操作的是缓存中的数据,并没有同步到数据库,所以数据库中的值不变。但是我们再手动开启事务的话,会调用 session.beginTransaction().commit(),
commit方法隐式的调用了flush方法,而flush的作用就是将session的缓存中的数据与数据库同步。所以解决方式也可以是不手动进行事物的提交,直接调用session.flush();
mark