Hibernate中Session对象详解

来源:互联网 发布:魔兽世界对Win10优化 编辑:程序博客网 时间:2024/04/30 06:43

一、session对象概述

     Session 接口是 Hibernate 向应用程序提供的操纵对数据库的最主要的接口, 它提供了基本的保存, 更新, 删除和加载Java 对象的方法.

二、理解session的缓存

1、在 Session 接口的实现中包含一系列的 Java 集合, 这些 Java 集合构成了 Session 缓存. 只要Session 实例没有结束生命周期, 存放在它缓存中的对象也不会结束生命周期

2、  session的save()方法持久化一个对象时,该对象被载入缓存,以后即使程序中不再引用该对象,只要缓存不清空,该对象仍然处于生命周期中。当试图load()对象时,会判断缓存中是否存在该对象,有则返回。没有在查询数据库

三、Session对象的得到方法

首先由Configuration对象实例化,然后读取调用其方法读取配置文件,当读取完毕后,调用buildSessionFactory()方法来构造出一个session对象的工厂对象。SessionFactory对象,SessionFactory对象调用opernSession()来得到一个session的对象。使用完session后记得要调用自身的close()方法来释放

四、Session对象的主要方法。

1、  可通过Session对象的get(),load(),save(),update(),delete()和saveOrUpdate()等方法对PO进行加载、保存、更新、删除、等操作

a)        Get()方法 执行查询。只能用指定的持久化对象和指定的id查询

b)       Load()方法 给session加载一个持久化的对象。使对象从瞬时转化为持久。

c)        Update()方法  执行更新,更改成新的实体内容、

d)       Delete方法    删除实体

e)        SaveOrUpdate方法  如果传入的参数是临时对象,就调用save()方法,如果传入的参数是脱管状态,就调用update方法,如果传入的参数是持久化对象,那就直接返回。

2、 在查询的情况下,可通过Session生成一个Query或者Criteria对象,然后利用Query和Criteria对象执行查询操作,如果没有异常,事务会将这些提交到数据库中并执行操作

a)        Query对象

面向对象的查询语言,与SQL不同,HQL中的对象名是区分大小写的(除了JAVA类和属性其他部分不区分大小写);HQL中查的是对象而不是和表,并且支持多态;HQL主要通过Query来操作,

Query q = session.createQuery(hql);

from Person

from User userwhere user.name=:name

from User userwhere user.name=:name and user.birthday < :birthday

 

b)       Criteria对象

Criteria是一种比HQL更面向对象的查询方式;Criteria的创建方式:

       Criteria crit =session.createCriteria(DomainClass.class);

       简单属性条件如:criteria.add(Restrictions.eq(propertyName, value)),

       criteria.add(Restrictions.eqProperty(propertyName,otherPropertyName))

五、清理session的缓存

l         Session 具有一个缓存, 位于缓存中的对象称为持久化对象, 它和数据库中的相关记录对应. Session 能够在某些时间点, 按照缓存中对象的变化来执行相关的 SQL 语句, 来同步更新数据库, 这一过程被称为清理缓存(flush)

l       默认情况下 Session 在以下时间点清理缓存:

•        当应用程序调用 Transaction 的 commit()方法的时, 该方法先清理缓存(session.flush()),然后在向数据库提交事务(tx.commit())

•        当应用程序执行一些查询操作时,如果缓存中持久化对象的属性已经发生了变化,会先清理缓存,以保证查询结果能够反映持久化对象的最新状态

•        显式调用 Session 的 flush() 方法.

l       区别:

     flush:进行清理缓存(此时缓存中的数据并不丢失)的操作,让缓存和数据库同步执行一些列sql语句,但不提交事务,;

     commit:先调用flush() 方法,然后提交事务. 则意味着提交事务意味着对数据库操作永久保存下来。

     reresh:刷新,让session和数据库同步,执行查询,把数据库的最新信息显示出来,更新本地缓存的对象状态.

     clear:清空缓存,等价于list.removeAll();

 

原创粉丝点击