session接口及其常用方法

                                                                         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
    2.在访问获得的代理对象的属性时,例如执行stu.getArress()时,因为此时的persistentContext中没有该persistentobject,所以会查询数据库。
    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当中的持久化对象同步到数据库中,在批量更新操作中非常常用。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值