Hibernate4.x之Session
2019独角兽企业重金招聘Python工程师标准>>>
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 }
转载于:https://my.oschina.net/yulei1943/blog/1490706
Hibernate4.x之Session相关推荐
- Cannot unwrap to requested type [javax.sql.DataSource]
为什么80%的码农都做不了架构师?>>> 遇上这个bug我的情况是这样,hibernate4以后,spring3.1不再有hibernateDaoSupport,在dao层不能 ...
- 2022面试200题目和答案分布式+微服务+MYSQL+Redis+JVM+Spring
200题目和答案分布式+微服务+MYSQL+Redis+JVM+Spring等等 带图MD在资源https://download.csdn.net/download/m0_47987937/86509 ...
- hibernate4 could not initialize proxy - no Session
在编写hibernate4的相关代码的时候,出现异常 org.hibernate.LazyInitializationException: could not initialize proxy - n ...
- spring4+hibernate4+springmvc+nginx+redis实现session共享
开发工具: intellJ idea 框架版本:spring4.3,hibernate4.3 新建maven项目,项目结构如下图: 直接上代码: User.java: package com.ssh. ...
- Hibernate4之session核心方法
在学习session的核心方法之前,我们先了解下hibernate中几种对象的状态: 暂时状态:这样的状态就好像咱们公司请的暂时员工一样,他在公司里没有相关的资料和id. 特点:在使用代理主键的情况下 ...
- Hibernate **关于hibernate4.3版本之后org.hibernate.service.ServiceRegistryBuilder被弃用**
之前一直都是使用hibernate4.2.21的我,有一天突然没有使用本地的jar包而是让IDEA自动下载最新版本的hibernate5.2.2之后,发现有几个经常使用的方法报错了. //创建配置对象 ...
- springmvc3.2+spring+hibernate4全注解方式整合(一)
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http:// ...
- hibernate4中取得connection的方法
在hibernate3中,使用了c3p0连接池,尝试了多种办法取得connection对象,以下两种可以使用. Java代码 Connection conn; // 方法1:hibernate4中将 ...
- Could not obtain transaction-synchronized Session
为什么80%的码农都做不了架构师?>>> 查了一下相关资料,整理如下: 原因:Hibernate4 No Session found for current thread原因 ...
最新文章
- 【转载】mysql慢查询
- 如何并行运行多个npm脚本?
- atlsoap.h”: No such file or directory
- 信息系统项目管理师:第4章:项目整体管理与变更管理(2)
- 马化腾最崇拜的作家吴晓波《历代经济变革得失》读书笔记
- 理解JavaScript中this的指向详解
- android 联系数据库
- 智能会议系统(33)---WebRTC学习之四:最简单的语音聊天
- 蓝宝石显卡bios_狼神矿卡烤机89°C!强刷蓝宝石RX570超白金显卡BIOS降温75°教程...
- private public php,[php]private public protected 三者区别
- python代码物理_python+appium的物理按键代码
- redis 学习笔记三
- Linux——驱动开发
- html rgb 颜色转换,将RGBA颜色转换为HTML颜色代码
- 7-设计模式之行为模式(模板方法、策略、命令、责任链)
- 项目实战:十种方法实现图像数据集降维
- Oracle 11g 从入门到精通 视频教程——适合新手入门学习
- 2023年东北大学外国语言学及应用语言学考研上岸经验贴
- SpringBoot实现接口签名防止篡改(V2)
- c# meiju(摘)
热门文章
- 送餐机器人市场达11.6亿 美团将成“搅局者”?
- 自动驾驶技术的终局,可能将无限期推迟来到
- 捡垃圾、跳大绳、种花、写字,波士顿动力机器狗迎来重大升级
- 运行在浏览器中的深度学习框架,开源了
- 静脉识别实现初步发展 多模态或成未来趋势
- 战略突破!又一国产芯片巨头即将追赶华为,成为思科的替代者?
- AI算法 真的能算出人类的欲望吗?
- 纯干货|目前看到的BERT比较透彻的文章,强烈推荐
- 百度推出自动驾驶系统Apollo2.0, 距商业化“更近一步”!
- SAP HUM 没有搬到Storage Type 923的HU能用HU02拆包?