Hibernate框架中Session的基本操作

来源:互联网 发布:南钢实名举报 知乎 编辑:程序博客网 时间:2024/05/16 07:40

Session的基本操作

Session接口可以说是Hibernate框架中使用最多的一个接口,他负责所有的持久化工作、负责管理持久化对象的生命周期、提供第一级别的高级缓存来保证持久化对象的数据与数据库同步。

Session的缓存:

缓存是指:java对象的属性占用的内存空间,一般使用集合类型的属性来作为缓存。Session这一级别的缓存称之为以及缓存,它是实现类SessionImpl中的成员属性persistenceContext(持久化上下文)中定义的一系列Java集合(map)属性构成的。

当应用程序调用Session的CRUD方法以及调用查询接口的list(),iterate()或filter()方法时,如果在Session缓存中不存在相应的对象,Hibernate就会把该对象加入到第一级缓存中,如果存在就不需要再去数据库加载而是直接使用缓存中的对象,可以减少访问数据库的频率,提高程序运行的效率。当Session在清理缓存时,Hibernate会自动进行脏数据检查,根据缓存中对象的状态变化来同步更新数据库。

利用Session进行持久化操作时,当调用Transaction的commit()事务提交方法时,会自动进行缓存清理同步数据库。另外,Session接口提供几个跟缓存相关的方法:

1、public void flush throws HibernateException:刷新缓存。它与事务提交commit()方法有不同之处:flush()进行缓存的清理,执行一系列的SQL语句,但不会提交事务。而commit()方法会先调用flush()方法,然后再提交事务。

2、public void setFlushMode(FlushMode flushMode):可以自定义设置清理缓存的时间点。

3、public FlushMode getFlushMode():获取当前的缓存清理的模式。(Session的缓存一般交由Hibernate框架自动管理而无需程序员干预)。

Session的基本操作:

Session是Hibernate中一个最重要的持久化管理器。它能完成对持久化类实例的基本CRUD操作、执行条件查询、事务控制,持久化对象生命周期管理等。Session接口中的持久化操作方法基本上都声明可能会抛出的一个HibernateException异常,这个异常是一个非受检的异常,这意味着在使用Session的持久化操作方法时可以处理这个异常,也可以不用理会,接下来介绍Session的这些方法:

Public Serializable save(Object obj)throw HibernateException:持久化给定的瞬时实例,并返回该实例的对象标识符值。

当调用save()方法时,它会完成一下操作:

1、    把瞬时对象加入动当前Session的缓存中,使他变为持久化对象。

2、    选用映射文件指定的主键生成器为此持久化对象分配唯一的OID(当对象处于持久化状态时,不允许程序随意改他的OID)

3、    计划执行一个insert语句,把此持久化对象的当前属性值组装到insert语句中。只有当Session清理缓存时,才会执行SQL insert语句。如果在save()方法之后,修改了持久化对象的属性值,Session清理缓存时会额外执行SQL update语句。

Public Object get(Classclazz,Serializable id) throws HibernateException:根据给定的OID返回一个持久化实例。Get方法先检验当前Session缓存中是否存在这个标示符值的持久化实例,如果存在直接返;如果不存在,就检查二级缓存中是否存在,如果有就直接返回,如果不存在,就从数据库表中获取数据返回如果数据库表中也没有,就直接返回null。

Public Object load(Class clazz,Serializable id)throw HibernateException:根据给定的OID返回一个持久化对象。Load方法先检验当前session 中否存在这个标示符值的持久化实例,如果存在直接返;如果不存在,就检查二级缓存中是否存在,如果有就直接返回,如果不存在,Hibernate框架不检查数据库是否存在这个标识符的记录,而是直接创建一个代理对象并返回,这个代理对象只包含标识符值,并没有其他属性的实际数据。这种方式就是常说的延迟加载(懒加载)。当这个标识符值对应实例的其他属性数据时,Hibernate才会从数据库中获取数据,所以必须保证这个操作是在当前Session未关闭时进行。如果此时发现数据库表中也不存在指定的标识符对应的行,就会抛出ObjectNotFoundException异常。

Public void delete(Object object)throws HibernateException:把指定的持久化实例转变成瞬时状态,并从数据库表中移除对应的记录。

1、      如果传入的实例是持久化状态的,Session就计划执行一个delete语句。

2、      如果传入的实例是脱管状态的,就先让它和当前Session关联转变为持久化对象,再计划执行一个delete语句。

Public void update(Object object)throws HibernateException:重复脱管对象,并把它的状态更新到数据库表中。

1、   把托管对象加入到当前Session缓存中,使他变为持久化对象。

2、   计划执行一个update语句。只有当前Session清理缓存时,才会执行SQL update语句。

Public void saveOrUpdate(Object obj)throws HibernateException:同时具有save()和update()的功能。

Public Object merge(Object object)throws HibernateException:将给定实例的状态复制到具有相同标识符的持久化实例上,并返回这个持久化实例。

原创粉丝点击