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 1 package com.yl.hibernate.entities; 2 2 3 3 import static org.junit.Assert.*; 4 4 5 5 import java.util.Date; 6 6 7 7 import org.hibernate.Session; 8 8 import org.hibernate.SessionFactory; 9 9 import org.hibernate.Transaction; 10 10 import org.hibernate.cfg.Configuration; 11 11 import org.hibernate.service.ServiceRegistry; 12 12 import org.hibernate.service.ServiceRegistryBuilder; 13 13 import org.junit.After; 14 14 import org.junit.Before; 15 15 import org.junit.Test; 16 16 17 17 public class HibernateTest { 18 18 19 19 private SessionFactory sessionFactory; 20 20 private Session session; 21 21 private Transaction transaction; 22 22 23 23 @Before 24 24 public void init() { 25 25 Configuration configuration = new Configuration().configure(); 26 26 ServiceRegistry serviceRegistry = 27 27 new ServiceRegistryBuilder().applySettings(configuration.getProperties()) 28 28 .buildServiceRegistry(); 29 29 30 30 sessionFactory = configuration.buildSessionFactory(serviceRegistry); 31 31 32 32 session = sessionFactory.openSession(); 33 33 34 34 transaction = session.beginTransaction(); 35 35 } 36 36 @After 37 37 public void destory() { 38 38 transaction.commit(); 39 39 40 40 session.close(); 41 41 42 42 sessionFactory.close(); 43 43 } 44 44 45 45 @Test 46 46 public void testSessionCache() { 47 47 News news = (News)session.get(News.class, 21); 48 48 System.out.println(news); 49 49 session.flush(); 50 50 News news2 = (News)session.get(News.class, 21); 51 51 System.out.println(news2); 52 52 53 53 System.out.println(news == news2);//true 54 54 } 55 55 56 56 /** 57 57 * flush:使数据库表中的记录和Session缓存中的对象的状态保持一致。为了保持一致,则可能会发送对应的SQL语句。 58 58 * 1.在Transaction的commit()方法中:先调用session的flush方法,再提交事务 59 59 * 2.flush()方法可能会发送SQL语句,但不会提交事务 60 60 * 3.注意:在为提交事务或显示调用session.flush()方法 之前,也有可能会flush()操作。 61 61 * 1).执行HQL或QBC查询,会先进行flush操作,以得到数据表的最新纪录 62 62 * 2).若记录的ID是由底层数据库使用自增的方式生成的,则在调用save方法时,就会立即发送INSERT语句 63 63 * 因为save方法后,必须保证对象的ID是存在的! 64 64 */ 65 65 @Test 66 66 public void testFlush2() { 67 67 News news = new News("Hibernate", "oracle", new Date()); 68 68 session.save(news); 69 69 } 70 70 71 71 @Test 72 72 public void testFlush() { 73 73 News news = (News)session.get(News.class, 21); 74 74 news.setAuthor("Bruce Eckel"); 75 75 76 76 News news2 = (News)session.createCriteria(News.class).uniqueResult(); 77 77 System.out.println(news2); 78 78 } 79 79 80 80 /** 81 81 * refresh():会强制发送SELECT 语句,以使Session缓存中对象的状态和数据表中对应的记录保持一致! 82 82 */ 83 83 @Test 84 84 public void testRefresh() { 85 85 News news = (News) session.get(News.class, 21); 86 86 System.out.println(news); 87 87 session.refresh(news); 88 88 System.out.println(news); 89 89 } 90 90 91 91 /** 92 92 * clear():清理缓存 93 93 */ 94 94 @Test 95 95 public void testClear() { 96 96 News news1 = (News) session.get(News.class, 21); 97 97 session.clear(); 98 98 News news2 = (News) session.get(News.class, 21); 99 99 } 100100 }
点赞
收藏

评论区

加载中...

相关推荐

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

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java常用类(2)

三、时间处理相关类Date类:计算机世界把1970年1月1号定为基准时间,每个度量单位是毫秒(1秒的千分之一),用long类型的变量表示时间。Date分配Date对象并初始化对象,以表示自从标准基准时间(称为“历元”(epoch),即1970年1月1日08:00:00GMT)以来的指定毫秒数。示例:packagecn.tanjian

tensorflow中协调器 tf.train.Coordinator 和入队线程启动器 tf.train.start_queue_runners

TensorFlow的Session对象是支持多线程的,可以在同一个会话(Session)中创建多个线程,并行执行。在Session中的所有线程都必须能被同步终止,异常必须能被正确捕获并报告,会话终止的时候,队列必须能被正确地关闭。TensorFlow提供了两个类来实现对Session中多线程的管理:tf.Coordinator和tf.Que

Hibernate映射关系及CRUD操作

Hibernate对象的三种状态的概念及互相转化:1.瞬时状态或临时状态(Transient):用new创建的对象,它没有持久化,没有处于Session中;2.持久状态(Persistent):已经持久化,加入到了Session缓存中。如通过hibernate语句保存的对象;3.三脱管状态或游离状态(Detached):持久化对象