Session的基本操作
Session是hibernate中一个重要的持久化管理器。他能完成对持久化类实例的基本CRUD操作、执行条件查询、事务控制,持久化对象生命周期管理等。Session接口中的持久化操作方法基本上都生明可能会抛出一个HibernateException异常这个异常是一个非受检的异常,这意味着在使用session的持久化操作的方法时,可以处理这个异常,也可以不用理会,接下来介绍session的这些方法。
1、 public Serializable save(Object obj)throws HibernateException;持久化给定的瞬时实例,并返回该实例的对象标识符值。
当调用save()方法时,他会完成以下操作。
(1) 把瞬时对象加入到当前Session的缓存中,使它变为持久化对象。
(2) 选用映射文件指定的主键生成器为持久化对象分配唯一的OID(当对象处于持久化状态时,不允许程序随意修改它的OID)。
(3) 计划执行一个insert语句,把持久化对象的当前属性值组装到insert语句中。只有当session清理缓存时,才会执行SQl insert语句。如果在save()方法之后,修改了持久化对象的属性值,Session清理缓存时会额外执行SQL update语句。
2、 public Object get(Class clazz,Serializable id)throwsHibernateException:根据给定的OID返回一个持久化实例。
Get方法先检查当前session缓存中是否存在这个标识符值的持久化实例,如果存在直接返回;如果不存在,就检查二级缓存中是否存在,如果存在就直接返回;如果不存在,就从数据库表中获取数据返回;如果数据库表中也不存在,就返回null。
3、 public Object load(Class clazz,Serializable id)throwsHibernateException:根据给定的OID返回一个持久化对象。
Load方法先检查当前session缓存中是否存在这个标识符值的持久化实例,如果存在直接返回;如果不存在,就检查二级缓存中是否存在,如果存在就直接返回,如果不存在,Hibernate框架不检查数据库中是否存在这个标识符值的记录,而是直接创建一个代理对象并返回,这个代理对象只包含标识符值,并没有其他属性的实际数据。这种方式就是常说的延迟加载(懒加载)。当要使用这个标识符值对应实例的其他属性时,Hibernate才会从数据库中获取数据,必须保证这个操作在session未关闭前操作。如果此时数据库表中也不存在指定的标识符对应的行,就会抛出ObjectNotFoundException异常。
4、 public Object delete(Class clazz,Serializable id)throwsHibernateException;把指定的持久化状态变成瞬时状态,并从数据库表中移除对应的记录。
(1) 如果传入的实例是持久化状态的,session就计划执行一个delete语句。
(2) 如果传入的实例是脱管状态的,就先让它和当前的session关联转变为持久化对象,在计划执行一个delete语句。
5、 public Object update(Class clazz,Serializable id)throwsHibernateException;重附脱管状态,并把他的状态更新到数据库表中。
(1) 把托管状态加入到当前的session缓存中,使它变为持久化对象。
(2) 计划执行一个update语句。只有当session清理缓存时,才会执行SQLupdate语句。
6、 public Object saveOrUpdateClass clazz,Serializable id)throwsHibernateException;同时具有save()和update()的功能。
7、 public Object merge(Class clazz,Serializable id)throwsHibernateException;将给定实例的状态复制到具有标识符的持久化实例上,并返回这个持久化实例。