session接口及其常用方法
session是Hibernate核心的接口。
由于本人是初学者,所以对这个理解的并不深,如有不同意见或者可以补充的请大家不吝赐教。
下面简单的谈谈一些常用的方法
1.数据持久化的方法 (save/persist)
session的save方法没有事务时也会输出SQL语句,但是persist方法不会,二者的共同点是最终都不会对数据库产生影响
@1.save方法会对数据库发送一次insert操作,所以会有SQl语句输出,但是当session关闭时由于没有事务,insert操作会 回滚,从而对数据库不会产生影响
@2.persist老霸道了,一看没事务开启,他急了,谁伺候你啊,果断不请求数据库,所以既不会打印,也不会对数据库产 生 影响
注:这个输出SQL语句,可以再hibernate.cfg.xml中配置,只需加入<property name="hibernate.show_sql">true</ property>
2.获取数据 (get/load/find(不在使用))
get/load都没有必要开启事务,因为不会对数据库的数据进行增删改的操作,(不会对数据发生变化)
@1. get会先从session中获取对象,若对象不存在,hibernate会立刻从数据库中查询(select语句)。当要查询的数据没有 时,会返回null。相当与我花钱买个驴肉火烧吃,我先看看钱包里有没有钱,没有去银行取。这个session就是钱包,数据 库就是银行了。
@2.load 比较麻烦一点引入一段代码比较容易理解:
Session session=getSessionFactory().openSession();
Transaction tr=session.beginTransaction();
Student stu=(Student)session.load(Student.class, new Integer(5));
stu.getAddress();
tr.commit();
session.close();
1.查找session所在的persistentContext(实例化环境)中是否有缓存的persistentobject(实例化对象)作为stu对象,如果没有,则需要建立代理对象,该代理对象不是我们认为的pojo,其中的代理对象的initialized属性为false,target属性为null
session是Hibernate核心的接口。
由于本人是初学者,所以对这个理解的并不深,如有不同意见或者可以补充的请大家不吝赐教。
下面简单的谈谈一些常用的方法
1.数据持久化的方法 (save/persist)
session的save方法没有事务时也会输出SQL语句,但是persist方法不会,二者的共同点是最终都不会对数据库产生影响
@1.save方法会对数据库发送一次insert操作,所以会有SQl语句输出,但是当session关闭时由于没有事务,insert操作会 回滚,从而对数据库不会产生影响
@2.persist老霸道了,一看没事务开启,他急了,谁伺候你啊,果断不请求数据库,所以既不会打印,也不会对数据库产 生 影响
注:这个输出SQL语句,可以再hibernate.cfg.xml中配置,只需加入<property name="hibernate.show_sql">true</ property>
2.获取数据 (get/load/find(不在使用))
get/load都没有必要开启事务,因为不会对数据库的数据进行增删改的操作,(不会对数据发生变化)
@1. get会先从session中获取对象,若对象不存在,hibernate会立刻从数据库中查询(select语句)。当要查询的数据没有 时,会返回null。相当与我花钱买个驴肉火烧吃,我先看看钱包里有没有钱,没有去银行取。这个session就是钱包,数据 库就是银行了。
@2.load 比较麻烦一点引入一段代码比较容易理解:
Session session=getSessionFactory().openSession();
Transaction tr=session.beginTransaction();
Student stu=(Student)session.load(Student.class, new Integer(5));
stu.getAddress();
tr.commit();
session.close();
1.查找session所在的persistentContext(实例化环境)中是否有缓存的persistentobject(实例化对象)作为stu对象,如果没有,则需要建立代理对象,该代理对象不是我们认为的pojo,其中的代理对象的initialized属性为false,target属性为null
2.在访问获得的代理对象的属性时,例如执行stu.getArress()时,因为此时的persistentContext中没有该persistentobject,所以会查询数据库。
3.查询数据库时,如果在数据库中找到该对象对应的记录,那么用获得的对象赋值给该代理对象的target属性,并且将initialized属性改为true;如果在数据库中找不到该对象对应的记录,那么抛出org.hibernate.ObjectNotFoundException异常。
3.查询数据库时,如果在数据库中找到该对象对应的记录,那么用获得的对象赋值给该代理对象的target属性,并且将initialized属性改为true;如果在数据库中找不到该对象对应的记录,那么抛出org.hibernate.ObjectNotFoundException异常。
3. 保存、更新 saveOrUpdate
简单的说:数据库中没有这条数据就保存,有就更新。
如果你知道hibernate对象的三种状态的话,就是瞬时态(在数据库或缓存中都没有)就保存,托管态也称游离态(在数据库中有缓存中没有)就更新
4、同步处理 merge
a、merge操作首先会向数据库进行一次查询,看对象是否在数据库中存在,若不存在就执行insert操作;若存在就执行 update操作。
b、merge方法执行完成后,并不会把对象变成持久的,而是脱管的(在merge方法后修改对象的状态,根据打印日志判断对象不是持久的)
c、merge和saveOrUpdate具有相似的功能,都是有则更新、无则保存;区别在于saveOrUpdate方法后对象是持久的,merge方法后对象是脱管的。
5、清除session缓存中所有的持久化对象 clear
6、evict 方法会清除session缓存中的指定的持久化对象
7、flush 方法会强制把session当中的持久化对象同步到数据库中,在批量更新操作中非常常用。
a、merge操作首先会向数据库进行一次查询,看对象是否在数据库中存在,若不存在就执行insert操作;若存在就执行 update操作。
b、merge方法执行完成后,并不会把对象变成持久的,而是脱管的(在merge方法后修改对象的状态,根据打印日志判断对象不是持久的)
c、merge和saveOrUpdate具有相似的功能,都是有则更新、无则保存;区别在于saveOrUpdate方法后对象是持久的,merge方法后对象是脱管的。
5、清除session缓存中所有的持久化对象 clear
6、evict 方法会清除session缓存中的指定的持久化对象
7、flush 方法会强制把session当中的持久化对象同步到数据库中,在批量更新操作中非常常用。