定义:用于获取与数据库的物理连接。 Session 对象是轻量级的,并且设计为在每次需要与数据库进行交互时被实例化。持久态对象被保存,并通过 Session 对象检索找回。
一,Hibernate有两种方式获得session,分别是: openSession和getCurrentSession
它们的区别在于
1. 获取的是否是同一个session对象
openSession每次都会得到一个新的Session对象
getCurrentSession在同一个线程中,每次都是获取相同的Session对象,但是在不同的线程中获取的是不同的Session对象
2. 事务提交的必要性
openSession只有在增加,删除,修改的时候需要事务,查询时不需要的
getCurrentSession是所有操作都必须放在事务中进行,并且提交事务后,session就自动关闭,不能够再进行关闭
二,session的三种状态:
瞬时态:在数据库中没有对应id的记录,同时在session缓存中也不存对应ID的对象(一般是刚new()出来的对象)
持久态:在数据库中有对应id的记录,同时在session缓存中也存在对应ID的对象(调用了save()或saveOrUpdate()等方法)
游离态:在数据库中有对应ID的记录,但在session缓存中不存在对应ID的对象(调用了close(),clear(),evict()等方法,游离状态一定有ID)
三,session常用方法:
1,load()与get():用来获取一个实体对象
介绍:
load是采用延迟加载方法,即当我们采用load()方法加载一个对象时,并不会发送SQL语句,得到的只是一个包含了实体对象ID值的代理对象,只有当我们使用具体属性时候,才会发送SQL语句。
当我们通过get方法的时候,不管后边怎样,就先通过SQL将该对象查询出来,也就是常说的立即加载。
使用load的加载方式要比get的加载方式性能好一点,因为load加载的时候,只是得到一个代理对象,当真正需要的时候才会去查询。这也代表了延迟加载与立即加载的同比。
差异:
get()方法来加载对象,当我们试图得到一个id不存在的对象时候,会报空指针异常,也就是NullPointException。
load()方法来加载对象,如果id不存在,若我们不使用该对象的任何属性,不会报错;但如果需要使用属性(也就是真正的去查询该对象),会报异常,但该异常并不是空指针,而是ObjectNotFoundException。
load的LazyInitializationException(懒加载异常),因为是延时加载,所以通过load方法得到了代理对象,但此时我们的session关闭了,但我们的对象还是存在的啊,所以当我们准备使用该对象属性的时候,就会报LazyInitializationException异常了
2,save():保存对象。
瞬时态(刚new()的对象,通过save()持久化,从而进入持久化状态),不应将持久化对象或游离对象传递给save()方法
3,persist():和save()类似
程序执行 save() 会立即将持久化对象对应的数据插入数据库;而 persist() 则保证当它在一个事物外部被调用时,并不立即转换成 insert 语句,save()的返回值是一个Serializable对象,而persist()方法返回值为void。
4,update():更新带有标识符且是给定的处于游离状态的实例的持久化实例。
将游离对象加入到Session缓存中,使其转变为持久化对象,计划执行一个update语句。
5,merge():可以完成save()和update()方法的功能,将新的状态合并到已有的持久化对象上或创建新的持久化对象,将游离态对象变为持久态。
6,saveOrUpdate():保存(对象)或更新(对象)给定的实例。
同时包含了save()方法与update()方法的功能,如果传入的参数是临时对象,就调用save()方法;如果传入的参数是游离对象,就调用update()方法。
7,delete():从数据存储中删除持久化实例。
既可以删除持久化对象,也可以删除游离对象,如果传入的参数是游离对象,则先使游离对象与Session关联,使它变为持久化对象。如果参数是持久化对象,则忽略该步,计划执行一个delete语句,把对象从Session缓存中删除,该对象进入删除状态。
8,lock():把一个没有更改过的游离状态的对象变成持久状态。
9,close():通过释放和清理 JDBC 连接以结束该会话。
10,clear():完全清除该会话。