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 }
时间: 2025-01-01 21:00:40

Hibernate4.x之Session的相关文章

Hibernate4中的session简述

1.Session 接口是 Hibernate 向应用程序提供的操纵数据库的最主要的接口, 它提供了基本的保存, 更新, 删除和加载 Java 对象的方法. 2.Session 具有一个缓存, 位于缓存中的对象称为持久化对象, 它和数据库中的相关记录对应. Session 能够在某些时间点, 按照缓存中对象的变化来执行相关的 SQL 语句, 来同步更新数据库, 这一过程被称为刷新缓存(flush) 3.站在持久化的角度, Hibernate 把对象分为 4 种状态: 持久化状态, 临时状态, 游

转 Spring @Transactional 声明式事务管理 getCurrentSession

Spring @Transactional声明式事务管理  getCurrentSession   在Spring @Transactional声明式事务管理的配置中,hibernate.current_session_context_class=thread- 这一句是不能加的-加了就会出错..那为什么不能加呢? 那是因为在Spring事务管理中,current Session是绑定到SpringSessionContext中的,而不是ThreadLocalSessionContext中的 先

SSH整合步骤之注解和非注解

spring整合hibernate 加入jar包 加入spring和aop所需必须包 加入hibernate的必须包 spring整合hibernate的必须包 org.springframework.jdbc-3.1.3.RELEASE.jar org.springframework.orm-3.1.3.RELEASE.jar org.springframework.transaction-3.1.3.RELEASE.jar 加入配置文件 加入spring的配置文件 加入hibernate的配

Hibernate4 No Session found for current thread

Hibernate4 与 spring3 集成之后, 如果在取得session 的地方使用了getCurrentSession, 可能会报一个错:“No Session found for current thread”, 这个错误的原因,网上有很多解决办法, 但具体原因的分析,却没有多少, 这里转载一个原理分析: SessionFactory的getCurrentSession并不能保证在没有当前Session的情况下会自动创建一个新的,这取决于CurrentSessionContext的实现

Hibernate4获得Session

在Hibernate3中获取Session的方法: Session session = this.getSession(): 前提是类要继承HibernateDaoSupport: public class XXX extends HibernateDaoSupport 在Hibernate4中,仍然需要继承HibernateDaoSupport,但是不能再this.getSession()了,只能通过SessionFacotry获得Session.首先要获得SessionFactory: @R

Hibernate4运行报错Could not obtain transaction-synchronized Session for current thread

org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:134) org.hibernate.internal.SessionFactoryImpl.get

Hibernate4中使用getCurrentSession报Could not obtain transaction-synchronized Session for current thread

架个spring4+hibernate4的demo,dao层直接注入的sessionFactory,然后用getCurrentSession方法获取session,然后问题来了,直接报错: Could not obtain transaction-synchronized Session for current thread 提示无法获取当前线程的事务同步session,略微奇怪,这和事务有什么关系..然后百度一下有人说改成用openSession方法就好了,那我又百度了一下这2个方法的区别:

SpringMVC4+Hibernate4运行报错Could not obtain transaction-synchronized Session for current thread

查了一下相关资料,整理如下: 原因:Hibernate4 No Session found for current thread原因 解决方法: 1.  在spring 配置文件中加入  程序代码 <tx:annotation-driven transaction-manager="transactionManager"/> 并且在处理业务逻辑的类上采用注解  程序代码 @Service public class CustomerServiceImpl implements

Hibernate4 No Session found for current thread原因

Hibernate4 与 spring3 集成之后, 如果在取得session 的地方使用了getCurrentSession, 可能会报一个错:“No Session found for current thread”, 这个错误的原因,网上有很多解决办法, 但具体原因的分析,却没有多少, 这里转载一个原理分析: SessionFactory的getCurrentSession并不能保证 在没有当前Session的情况下会自动创建一个新的,这取决于CurrentSessionContext的实