Hibernate在更新时,是可以不用session的update方法的

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负责领域对象和数据库的同步。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值