hibernate之数据存储

1,session.save();

方法用于实体对象到数据库的持久化操作,Session.save()方法调用与实体对象所匹配的Insert SQL作用相同,将数据插入到数据库表中!

		TUser user = new TUser();;
		user.setName("keith ");
	        user.setAge(new Integer(18+i));
		user.setInfo("the stu No is:");

		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
                session.save(user);
		session.getTransaction().commit();	

 创建user对象,启动Transaction,之后通过save()方法将user进行保存;

在保存的其中,主要包含一下的几个步骤:

  1. 在session内部缓存中寻找待保存对象(如果有,则认为此对象已经被保存了,实体对象处于Persistent状态),直接返回;
  2. 如果实体对象实现了lifecycle接口,则调用待保存对象的onSave方法;
  3. 如果实体类实现了Validatable接口,则调用其Validatable()方法;
  4. 调用对拦截器的Interceptor.onSave()方法(如果有的话);
  5. 构造Insert SQL并加以执行;
  6. 记录插入成功,user.id属性被设定为insert操作返回的新纪录id值;
  7. 将user放入内部缓存里(不会将实体对象放入二级缓存,通过save方法保存的实体对象,在事务剩余的部分中被修改的几率会很高,缓存的频繁更新,以及数据同步问题的代价会很大);
  8. 如果存在级联关系,对级联关系进行递归处理;

2,session.update()

		TUser user = new TUser();
		user.setName("given");
		session.save(user);
		session.getTransaction().commit();
		
		user.setName("kkk");
		session.update(user);
		session.getTransaction().commit();

 在update方法中,将一个Detached状态的对象与Session重新关联起来,从而使之变成Persisent状态;

包含以下步骤:

  1. 首先,根据待更新实体对象的Key,在当前session的内部缓存中进行查找,如果发现,则认为当前对象已经是处于Persisent,返回(对于一个Persisent状态的对象,update对他不起作用);
  2. 初始化实体对象的状态信息(作为之后脏数据检查的依据),并将其纳入内部缓存,这里Session.update()并没有发出Update SQL语句,而是在Session.getTransaction().commit()的情况下,才发出语句;

3,session.saveOrUpdat()

		TUser user = new TUser();
		user.setName("given");
		session.saveOrUpdate(user);
		session.getTransaction().commit();

 上面代码的执行步骤:

  1. 首先在Session内部缓存中进行查找,如果发现则直接返回;
  2. 执行实体类对应的Interceptor.isUnsaved()方法(如果有的话),判断对象是否为未保存状态;
  3. 根据unsaved-value判断对象是否处于未保存状态;
  4. 如果对象未保存(Transient),则调用save()方法保存对象;
  5. 如果对象已保存(Detached),则调用update()方法更新对象;

在开发中,我们可以通过接口约定业务逻辑和持久层的交互方式,如:

public interface TUserDAO{
       public TUser getTUser(Integer id);
       public void saveUser(TUser user);
}
 

当调用saveUser()时,我们不知道穿过来的User是什么样一个状态;这个时候我们就可以用saveOrUpdate()方法,如果传过来的对象是Transient状态,就用save()方法,如果是Detached状态,我们就应该调用update()方法;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值