Hibernate在更新时,是可以不用session的update方法的
2013-03-18 16:57
381 查看
public void synDevNameWithItil(){ Session session = null; Transaction tr = null; try { session = HibernateUtil.getSession(); tr = session.beginTransaction(); tr.begin(); Query query = session.createQuery("..."); List<Device> devList = query.list(); for(int i=0;i<devList.size();i++){ Device device=devList.get(i);; String itilName= getDeviceNameFromItil(device.getIp()); if(StringUtils.isNotEmpty(itilName)){ device.setName(itilName); } } tr.commit(); } catch (Exception ex) { _log.error("", ex); HibernateUtil.rollBack(tr); } finally { HibernateUtil.closeSession(session); } }
这段代码就是想更新一下数据库中的Device对应表的name字段。我的同事觉得,怎么没调用session.update方法去更新device呀。
当时我很是惊呀,我一直以为这是hibernate最普通的用法。没想到我同事这样的老行家,也还有误区。
其实hibernate实现的是持久化类对象和数据库之间的透明映射。hibernate努力想做到的就是让hibernate的使用者,不用去关心对象如何从数据库中存入和取出。
Session提供了三个和存储相关的常用方法:save、update、delete。很多人认为,调用这三个方法时,hibernate就会向数据库发出:insert、update、delete SQL语句。其实不完全是这样的,这三个方法的直接语意,是用来改变持久化对象的状态,而不是用来指挥hibernate向数据库发出sql的。比如:
从session中读取一个对象后,立即调用update方法更新,hibernate会忽略这个update调用。
那这三个方法有什么用呢?它们是用来让持久化对象进行状态切换的,如下所示:
save : 从临时状态 ==》持久化状态
update: 从游离状态 ==》持久化状态
delete: 持久化状态 ==》临时状态
在session中存在的持久化对象是处于持久化状态的。
session关闭后,之前从session中读取的持久化对象即为游离态。
在数据库中不存在的持久化对象为监时态。
上边举的例子,之所以调update不起作用,是因为当前对象已经是持久化状态了,不需要状态切换。
当事务提交时,hibernate会自动按照一定的策略将session中的持久化对象,同步到数据库中,从而自动使数据库的状态和session中的对象状态完全一致。如果要在事务提交前同步,则可以使用session的flush方法。
这是hibernate的一个优秀的设计。它使得hibernate的使用者,可以专注于对象的变化(对象的状态、属性、关系)而不必考虑,对象的变化如何反映到数据库上。
正是由于这一点,使得在hibernate上构造充血模型成为可能。因为,可以直接将持久化类做为领域对象,由hibernate负责领域对象和数据库的同步。
相关文章推荐
- Hibernate在更新时,是可以不用session的update方法的
- Hibernate在更新时,是可以不用session的update方法的(
- Hibernate在更新时,是可以不用session的update方法的
- Hibernate更新数据(不用update也可以)
- hibernate中session中的update方法,改动了一下,让数据库中原有的属性不变,只更新传入对象中改动的属性
- getHibernateTemplate().update()方法更新不了解决办法
- hibernate框架中session的save() 和 update() 方法的区别 saveOrUpdate()方法
- hibernate中两表一对一关系 和 session.save()方法和 session.saveOrUpdate()方法
- Hibernate中如何只更新修改过的字段,未修改的字段不用更新??(3中方法) .
- Hibernate更新某些字段的几种update方法
- Hibernate中如何只更新修改过的字段,未修改的字段不用更新??(3中方法)
- hibernate 关于session的update方法
- hibernate update 只更新部分字段的3种方法
- Hibernate更新某些字段的几种update方法
- hibernate saveorupdate方法只有更新有效果,保存没有效果
- Hibernate中对象的三种状态以及Session类中saveOrUpdate方法与merge方法的区别
- [原创]java WEB学习笔记79:Hibernate学习之路--- 四种对象的状态,session核心方法:save()方法,persist()方法,get() 和 load() 方法,update()方法,saveOrUpdate() 方法,merge() 方法,delete() 方法,evict(),hibernate 调用存储过程,hibernate 与 触发器协同工作
- Hibernate学习篇12——session方法之save与update
- hibernate中的update方法只更新部分字段的方法
- hibernate update 只更新部分字段的3种方法