SSH|也来说说关于Hibernate使用update更新数据时,不更新的问题



现在使用hibernate框架的虽然没有前2年那么多了,但是还是有很多项目在使用hibernate框架的,毕竟作为一个优秀的持久层框架,hibernate自然有存在的价值。
好了,废话不多说,结合最近的使用,和大家一起探讨一个hibernate经常遇到的问题:
问题描述:用SSH框架,开发项目时,进行修改操作时,比如修改密码、修改某个表的某个字段的信息等等,初学者经常会遇到的一个问题是,项目没有报错,update操作执行了,就是数据库的数据没有更新。也就是说执行了update,但是数据并没有更新。今天我尝试用另一种方法,来完成这个问题。我不使用update,而是先delete,再save,因为update方法在使用时,确实会存在很多意想不到的情况,我们必须先分析我们的update操作会不会执行,是如何执行的,这对于初学者来说,是一个容易出现错误的地方。如果适用今天我介绍的这种方法,就好理解的多了。


先搞清楚这2段代码的区别:
User user; //这是一个定义的对象,没有实例化,如果我们用它来接收查询出来的数据,也就是让他指向查询结果,此时,他就是hibernate里的持久化状态的对象;

User user = new User(); //这也是一个对象,已经实例化了,对hibernate来说,这是一个Transient(临时状态)的对象;



好,我先说一下几个要点:
1,Hibernate中对象的3种状态,这个一定要知道Transient(临时状态)、Detached(游离状态)、Persistent(持久化状态);然后继续;
2,业务需求大概是这样的,我们在修改密码时,一般都需要先进行oldPassword的验证,如果正确,然后才会执行更新操作;
3,同样的,我们可以采用另一种方法,查询出来的持久化状态的对象,先删除,再通过setter方法赋值,再保存;【有人会问,如果这样来实现update,那如果一个表有N多个字段,赋值的时候,不是要重复的写N多个语句吗?其实不用写N多个语句,哪个字段需要修改,就给哪个字段赋值】

4,这里我先执行this.getHibernateTemplate().delete(user); 删除user对象,然后给User对象赋值,然后执行保存this.getHibernateTemplate().save(user);


通过运行,上述方法是能够成功修改数据库中的数据的,是可行的。还有几个概念我们需要理清一下:
1,从数据查询出来的数据,在没有执行delete操作之前,是持久化状态;
2,执行delete语句时,hibernate不会马上去数据库中删除对应的记录,而是要等事务提交以后,再统一执行;
3,我们执行delete操作时,我们要操作的这个对象User还存在于内存中,并且数据库中的记录也还在;
4,由于我们在事务提交之前执行了sava操作,所以能够实现update的操作;
5,我们可以把hibernate理解为一个容器,一个处理对象的容易,只要对象进入了我这个容器,不管过程是怎样的,不管执行了什么操作,最后在出去的时候,都是统一处理的。所以,在使用hibernate框架实现业务需求时,hibernate是灵活的,在hibernate这个容器里,你可以发挥自己的想象力,灵活应用。因为不管你怎么操作,我都不会马上去数据库执行,不会影响数据库的性能。


【SSH|也来说说关于Hibernate使用update更新数据时,不更新的问题】





    推荐阅读