Hibernate开发之session

Hibernate开发之Session

一丶Ssession概述

               1. 表示应用程序与数据库之间交互操作的一个单线程对象,此对象生存期很短。 其隐藏了JDBC连接,也是Transaction的工厂。 其会持有一个针对持久化对象的必选(第一级)缓存,在遍历对象图或者根据持久化标识查找对象时会用到。

      2. 简单的说,session是hibernate的运作中心,所有持久化对象必须在 session 的管理下才可以进行持久化操作。它提供基本的保存,增加,删除,以及加载对象的方法。

上面已经提到,session里维护着一个缓存,所有保存在里面的对象被称为一个持久化的对象。而session可以在特定的时间点,刷新缓存(flush()方法)。利用缓存技术,可以减少hibernate应用程序访问数据的频率
              3. 从hibernate的角度看,对象可以分为持久化对象,临时对象,游离对象,删除对象。通过session所提供的特定方法,可以使一个对象从一个状态转变到另外一个状态。

二丶Session的构造

          1.Session是通过SessionFactory来获得的,所以首先需要获得SessionFactory对象,SessionFactory则是个线程安全的全局对象,只需要被实例化一次,编写一个HIbernateUtil辅助类来负责启动Hibernate和更方便地操作SessionFactory,有以下代码完成:
           
package util;

import org.hibernate.*;
import org.hibernate.cfg.*;

public class HibernateUtil {
    //设置为静态常量,保证SessionFactory可以在程序中唯一
    private static final SessionFactory sessionFactory;

    static {
        try {
         // 从配置文件中创建sessionFactory
<span style="white-space:pre">	</span>//1).创建Configuration对象:代表配置文件
<span style="white-space:pre">	</span>Configuration configuration=new Configuration().configure();
<span style="white-space:pre">	</span>//2)创建serviceRegistry对象
<span style="white-space:pre">	</span>ServiceRegistry serviceRegistry=new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
<span style="white-space:pre">	</span>sessionFactory=configuration.buildSessionFactory(serviceRegistry);
        } catch (Throwable ex) {
            // Make sure you log the exception, as it might be swallowed
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }

}
      2.获得SessionFactory后,有2种方式获得Session对象,一是调用openSession()方法 ,二是调用getCurrentSession()方法。
        这2中方法的区别是:
        1) openSession方法必须自行关闭,而getCurrentSession方法在事务结束后自动关闭
        2) openSession()方法没有与当前的线程绑定,而getCurrentSession()方法与当前线程绑定。
        3)如果使用currentSession需要在hibernate.cfg.xml文件中进行配置:
           a、如果是本地事务(jdbc事务)
     <propertyname="hibernate.current_session_context_class">thread</property>
           b、如果是全局事务(jta事务)
       <propertyname="hibernate.current_session_context_class">jta</property>

三丶Session的基本操作

        1.保存操作:
            可以通过Session对象的save(),persist()方法来完成。
            1)save():save方法可以使临时对象转换为持久化对象,根据映射文件中指定的标识符生成器, 为持久化对象分配唯一的                                     ID, 并且调用sava方法并不是立即执行sql语句,而是当flush缓存时执行。注意在使用代理主键的情况下,在sava()方法之前修改id 是无效的。
            2)persist():persist()方法与save()功能大体相同,但又有区别,当持久化对象的oid不为空时,则执行persist()方法会报错,                                  而save() 会以新的oid保存在数据库中。
        2.获取操作:
            可以通过Session对象的get(),load方法获取一个指定oid的持久化对象
            1)get():执行get方法:会立即加载对象
            2)load():而执行load方法,是延迟加载(只有用时才会加载),并且当数据库中不存在与oid对应的记录,会抛出                                           ObjectNotFoundException异常, 而get方法返回空。 
        3.更新操作:            
可以通过Session对象的update(),saveOrUpdate()方法来执行此操作。
            1)update():在同一个Session中取出持久化对象,接着更新对象状态,而后将Transaction commit,由于在commit                               前会先执行flush操作,会将持久化对象状态更新或者保存在数据库中,则持久化对象状态更新已反应至数库中,所以无需额外进行任何的更新操作。 如果先开启了一个Session,从数据库中取出持久化对象,之后关闭Session,当持久化对象被操作完毕并储存时,这时需要重新开启一个Session,使用update()方法将持久化对象更新至对应的数据库中。
            2)saveOrUpdate():使用saveOrUpdate()方法,为对象的储存或更新提供了一个统一的操作,可以定义映射文件,设                                          定< id>标签的unsaved-value来决定执行更新或者保存操作。
 <id name="id" column="id" type="java.lang.Integer" unsaved-value="null">
    <generator class="native"/> 
 </id> 
  unsaved-value可以设定的值包括:any:总是储存 none:总是更新 null:id为null执行保存操作,id 不为null执行update操作 v alid:id为null或是指定值时储存,这样设定之后,可以使用Session的saveOrUpdate()方法来取代update()方法。
     4.删除操作:
        可以通过调用Session对象的delete方法来完成
         1)delete():计划执行一条 delete 语句,把对象从 Session 缓存中删除, 该对象进入删除状态.Hibernate.cfg.xml                              配置文件中有一个 hibernate.use_identifier_rollback 属性, 其默认值为 false, 若把它设为 true, 将改变delete() 方法的运行行为: delete() 方法会把持久化对象或游离对象的 OID 设置为 null, 使它们变为临时对象。


四丶小结
      由于自己第一次学习hibernate,所以还有很多知识点遗漏,再是上面都是文字内容,没有辅以代码,所以以后会改进这一内容。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值