Hibernate4.x之Session

Stella981
• 阅读 609

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 }
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java常用类(2)
三、时间处理相关类Date类:计算机世界把1970年1月1号定为基准时间,每个度量单位是毫秒(1秒的千分之一),用long类型的变量表示时间。Date分配Date对象并初始化对象,以表示自从标准基准时间(称为“历元”(epoch),即1970年1月1日08:00:00GMT)以来的指定毫秒数。示例:packagecn.tanjian
Easter79 Easter79
3年前
tensorflow中协调器 tf.train.Coordinator 和入队线程启动器 tf.train.start_queue_runners
TensorFlow的Session对象是支持多线程的,可以在同一个会话(Session)中创建多个线程,并行执行。在Session中的所有线程都必须能被同步终止,异常必须能被正确捕获并报告,会话终止的时候,队列必须能被正确地关闭。TensorFlow提供了两个类来实现对Session中多线程的管理:tf.Coordinator和tf.Que
Wesley13 Wesley13
3年前
Java Web学习总结(11)——Session使用示例教程
一、Session简单介绍  在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中
Stella981 Stella981
3年前
Hibernate映射关系及CRUD操作
Hibernate对象的三种状态的概念及互相转化:1.瞬时状态或临时状态(Transient):用new创建的对象,它没有持久化,没有处于Session中;2.持久状态(Persistent):已经持久化,加入到了Session缓存中。如通过hibernate语句保存的对象;3.三脱管状态或游离状态(Detached):持久化对象
Stella981 Stella981
3年前
JSP内置对象之session
      在实际开发中session主要用以完成用户的登陆以及注销等常见功能,每一个session都表示不同的访问用户,session对象是javax.servlet.http.HttpSession接口的实例化对象,所以session只能应用于HTTP协议中。      取得SessionId:当一个用户连接到一个服务器后,服务器会自动
Stella981 Stella981
3年前
Mybatis一二级缓存实现原理与使用指南
Mybatis与Hibernate一样,支持一二级缓存。一级缓存指的是Session级别的缓存,即在一个会话中多次执行同一条SQL语句并且参数相同,则后面的查询将不会发送到数据库,直接从Session缓存中获取。二级缓存,指的是SessionFactory级别的缓存,即不同的会话可以共享。缓存,通常涉及到缓存的写、读、过期(更新缓存
Stella981 Stella981
3年前
Hibernate原生SQL查询
Hibernate除了支持HQL查询外,还支持原生SQL查询。对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()获取这个接口。该接口是Query接口的子接口。执行SQL查询步骤如下:1、获取HibernateSession对象2、编写SQL语句3、通过Session的createS
Stella981 Stella981
3年前
Hibernate对象
1)SessionFactory这是Hibernate的关键对象,它是单个数据库映射关系经过编译后的内存镜像,它也是线程安全的。它是生成Session的工厂,本身需要依赖于ConnectionProvider,该对象可以在进程或集群的级别上,为那些事务之间可以重用的数据提供可选的二级缓存。2)Session它是应用程序和持久层之间交互操作的一个单