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进行保存;
在保存的其中,主要包含一下的几个步骤:
- 在session内部缓存中寻找待保存对象(如果有,则认为此对象已经被保存了,实体对象处于Persistent状态),直接返回;
- 如果实体对象实现了lifecycle接口,则调用待保存对象的onSave方法;
- 如果实体类实现了Validatable接口,则调用其Validatable()方法;
- 调用对拦截器的Interceptor.onSave()方法(如果有的话);
- 构造Insert SQL并加以执行;
- 记录插入成功,user.id属性被设定为insert操作返回的新纪录id值;
- 将user放入内部缓存里(不会将实体对象放入二级缓存,通过save方法保存的实体对象,在事务剩余的部分中被修改的几率会很高,缓存的频繁更新,以及数据同步问题的代价会很大);
- 如果存在级联关系,对级联关系进行递归处理;
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状态;
包含以下步骤:
- 首先,根据待更新实体对象的Key,在当前session的内部缓存中进行查找,如果发现,则认为当前对象已经是处于Persisent,返回(对于一个Persisent状态的对象,update对他不起作用);
- 初始化实体对象的状态信息(作为之后脏数据检查的依据),并将其纳入内部缓存,这里Session.update()并没有发出Update SQL语句,而是在Session.getTransaction().commit()的情况下,才发出语句;
3,session.saveOrUpdat()
TUser user = new TUser();
user.setName("given");
session.saveOrUpdate(user);
session.getTransaction().commit();
上面代码的执行步骤:
- 首先在Session内部缓存中进行查找,如果发现则直接返回;
- 执行实体类对应的Interceptor.isUnsaved()方法(如果有的话),判断对象是否为未保存状态;
- 根据unsaved-value判断对象是否处于未保存状态;
- 如果对象未保存(Transient),则调用save()方法保存对象;
- 如果对象已保存(Detached),则调用update()方法更新对象;
在开发中,我们可以通过接口约定业务逻辑和持久层的交互方式,如:
public interface TUserDAO{
public TUser getTUser(Integer id);
public void saveUser(TUser user);
}
当调用saveUser()时,我们不知道穿过来的User是什么样一个状态;这个时候我们就可以用saveOrUpdate()方法,如果传过来的对象是Transient状态,就用save()方法,如果是Detached状态,我们就应该调用update()方法;