zoukankan      html  css  js  c++  java
  • Hibernate4.x之Session

    Hibernate Session概述

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

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

      站在持久化的角度,Hibernate把对象分为4种状态:持久化状态、临时状态、游离状态、删除状态。Session的特定方法能使对象从一个状态转换到另一个状态。

    Session缓存

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

      Session缓存可减少Hibernate应用程序访问数据库的频率。

      操作Session缓存:

        flush():Session按照缓存中对象的属性来同步更新数据库

          默认情况下Session会在以下时间点刷新缓存:
            显式调用Session的flush()方法
            当应用程序调用Transaction的commit()方法时,该方法先刷新缓存(flush),然后向数据库提交事务
            当应用程序执行一下儿查询(HQL,Criteria)操作时,如果缓存中持久化对象的属性已经发生了变化,会先flush()缓存,以保证查询结果能够反映持久化对象的最新状态
          

          flush缓存的例外情况:如果对象使用native生成器生成OID,那么当调用Session的save()方法保存对象时,会立即执行向数据库插入改实体的insert语句。
    commit()和flush()方法的区别:flush执行一系列的sql语句,但不提交事务;commit方法先调用flush方法,然后提交事务,意味着提交事务,意味着对数据库操作永久保存下来。

      refresh():会强制发送SELECT 语句,以使Session缓存中对象的状态和数据表中对应的记录保持一致!
      clear():清理缓存

    测试类:

      

      1 package com.yl.hibernate.entities;
      2 
      3 import static org.junit.Assert.*;
      4 
      5 import java.util.Date;
      6 
      7 import org.hibernate.Session;
      8 import org.hibernate.SessionFactory;
      9 import org.hibernate.Transaction;
     10 import org.hibernate.cfg.Configuration;
     11 import org.hibernate.service.ServiceRegistry;
     12 import org.hibernate.service.ServiceRegistryBuilder;
     13 import org.junit.After;
     14 import org.junit.Before;
     15 import org.junit.Test;
     16 
     17 public class HibernateTest {
     18 
     19     private SessionFactory sessionFactory;
     20     private Session session;
     21     private Transaction transaction;
     22     
     23     @Before
     24     public void init() {
     25         Configuration configuration = new Configuration().configure();
     26         ServiceRegistry serviceRegistry = 
     27                 new ServiceRegistryBuilder().applySettings(configuration.getProperties())
     28                                             .buildServiceRegistry();
     29 
     30         sessionFactory = configuration.buildSessionFactory(serviceRegistry);
     31         
     32         session = sessionFactory.openSession();
     33 
     34         transaction = session.beginTransaction();
     35     }
     36     @After
     37     public void destory() {
     38         transaction.commit();
     39         
     40         session.close();
     41         
     42         sessionFactory.close();
     43     }
     44     
     45     @Test
     46     public void testSessionCache() {
     47         News news = (News)session.get(News.class, 21);
     48         System.out.println(news);
     49         session.flush();
     50         News news2 = (News)session.get(News.class, 21);
     51         System.out.println(news2);
     52         
     53         System.out.println(news == news2);//true
     54     }
     55 
     56     /**
     57      * flush:使数据库表中的记录和Session缓存中的对象的状态保持一致。为了保持一致,则可能会发送对应的SQL语句。
     58      *     1.在Transaction的commit()方法中:先调用session的flush方法,再提交事务
     59      *  2.flush()方法可能会发送SQL语句,但不会提交事务
     60      *  3.注意:在为提交事务或显示调用session.flush()方法 之前,也有可能会flush()操作。
     61      *      1).执行HQL或QBC查询,会先进行flush操作,以得到数据表的最新纪录
     62      *      2).若记录的ID是由底层数据库使用自增的方式生成的,则在调用save方法时,就会立即发送INSERT语句
     63      *  因为save方法后,必须保证对象的ID是存在的!
     64      */
     65     @Test
     66     public void testFlush2() {
     67         News news = new News("Hibernate", "oracle", new Date());
     68         session.save(news);
     69     }
     70     
     71     @Test
     72     public void testFlush() {
     73         News news = (News)session.get(News.class, 21);
     74         news.setAuthor("Bruce Eckel");
     75         
     76         News news2 = (News)session.createCriteria(News.class).uniqueResult();
     77         System.out.println(news2);
     78     }
     79     
     80     /**
     81      * refresh():会强制发送SELECT 语句,以使Session缓存中对象的状态和数据表中对应的记录保持一致!
     82      */
     83     @Test
     84     public void testRefresh() {
     85         News news = (News) session.get(News.class, 21);
     86         System.out.println(news);
     87         session.refresh(news);
     88         System.out.println(news);
     89     }
     90     
     91     /**
     92      * clear():清理缓存
     93      */
     94     @Test
     95     public void testClear() {
     96         News news1 = (News) session.get(News.class, 21);
     97         session.clear();
     98         News news2 = (News) session.get(News.class, 21);
     99     }
    100 }
  • 相关阅读:
    3503: [Cqoi2014]和谐矩阵
    2734: [HNOI2012]集合选数
    P3900 [湖南集训]图样图森破
    4557: [JLoi2016]侦察守卫
    牛客OI周赛6-提高组 B 践踏
    连续区间的最大公约数
    Wannafly挑战赛5 D. 子序列
    牛客国庆集训派对Day1 B. Attack on Titan
    4538: [Hnoi2016]网络
    [SHOI2015]超能粒子炮·改
  • 原文地址:https://www.cnblogs.com/dreamfree/p/4111777.html
Copyright © 2011-2022 走看看