Hibernate5笔记3--详解Hibernate的API
详解Hibernate的API:
(1)Configuration接口:
org.hibernate.cfg.Configuration接口的作用是加载主配置文件及映射文件,以实现对Hibernate的启动。Configuration实例调用buildSessionFactory方法便可创建一个Session工厂SessionFactory对象。
Configuration cfg = new Configuration().configure();
new Configuration()会加载一个属性文件hibernate.properties。该属性文件中存放着数据连接配置、Hibernate配置等配置信息。一般情况下不用设置该属性文件,其设置已经放到了主配置文件中。若要设置,应将其放于src目录下。该文件的模板存放于Hibernate框架解压目录下的project/etc下。
configure()方法,用于加载和解析hibernate.cfg.xml配置文件及映射文件。该方法返回一个Configuration对象。所以,cfg是一个包含配置信息及映射的Configuration对象。
(2)SessionFactory接口:
org.hibernate. SessionFactory接口对象是由Configuration对象通过buildSessionFactory()方法创建。创建该对象的目的是,用于开启Session对象。
SessionFactory sessionFactory = cfg.buildSessionFactory();
SessionFactory的特点:重量级对象(系统开销大)、单例的、线程安全的。 按理说,单例对象一定是被共享的,是线程不安全的。但查看SessionFactory接口的实现类SessionFactoryImpl源码,可以看其大多数成员变量是final的,所以其是线程安全的。
SessionFactory的使用原则:基于其是线程安全的重量级对象,其创建与销毁时系统开销大,又是单例的特点,SessionFactory对象一般不手工关闭,而是在应用结束时自动将其销毁。因此,SessionFactory不用进行close()关闭。
(3)Session接口:
org.hibernate.classic.Session接口是应用程序与Hibernate连接的核心API,是Hibernate向应用程序提供的操纵DB的最主要接口。它提供了基本的保存、更新、删除与查询方法。由SessionFactory对象创建。
Session s= sessionFactory.openSession();
Session的特点:轻量级对象、线程不安全的、多例的。 在Web应用中,多个用户对同一应用访问,Hibernate会为每个用户创建一个Session对象。所以是多例的。session中包含大量非final成员变量,对于同一个用户的操作,可能会产生多个事务,这多个事务若同时对同一个Session的同一个成员变量进行访问,就会引起并发问题。所以session是线程不安全的。
Session的使用规则:Session在使用时要做到一个线程一个Session,即一个事务一个Session。使用完毕,立即关闭。Session不要作为某个类的成员变量出现,因为这样会出现多个实例对象对同一个session的共享,使其更不安全。
Session的正确获取方式:为了保证一个线程一个Session,即一个线程中使用的Session是同一个对象,一般在获取Session对象时,使用SessionFactory的getCurrentSession()方法。不过,使用该方法获取Session对象,需要在主配置文件中对Session所处的上下文环境,即事务环境进行注册。使用getCurrentSession()方法获取的Session,在进行事务提交或回滚后,会自动关闭,无需再手工进行close()。(getCurrentSession()是对openSession()的包装,包装在ThreadLocal方法中)
<!-- 当前Session上下文 -->
<property name="hibernate.current_session_context_class">thread</property>
其取值有三种:thread(表示当前Session所处的环境为本地事务环境,Session会与当前线程绑定)、jta(表示当前Session所处的环境为分布式事务环境)、SpringSessionContext类(SSH整合时使用)
openSession和getCurrentSessiond的区别:
Session的常用方法:
save()/persist() :添加对象 update() :修改对象 saveOrUpdate():添加或修改对象 delete():删除对象 get()/load():根据主键查询
createQuery() / createSQLQuery():创建查询对象 createCriteria():条件查询,QBC,纯面向对象语句
(4) Transaction接口:
通过该接口,可以将事务从持久层,提升到业务层。由Session对象创建。
session.getTransaction();
事务的开启:session.beginTransaction(); 或 session.getTransaction().begin();
事务的提交:session.getTransaction().commit();
事务的回滚:session.getTransaction().rollback();
持久对象状态管理:
(1)Hibernate的对象状态:
这里的状态是只对象处于什么存储介质中,用于存放对象的存储介质有三个:普通内存(与Hibernate无关)、Session缓存、数据库。对象处于不同的介质中,就将处于不同的状态。
(1)瞬时态(transient态):在内存,不在Session,不在数据库
(2)持久态(persistent态):在内存,在Session,在数据库
(3)游离态(detached态):在内存,不在Session,在数据库
(4)无名态:不在内存,不在Session,在数据库
(2) 状态转换图:
上图中部分方法的介绍:evict():将指定对象仅仅从session中删除,但不删除数据库中的该数据;close():关闭Session对象;clear():清空Session的缓存
Hibernate5笔记3--详解Hibernate的API的更多相关文章
- Scrapy笔记04- Selector详解
Scrapy笔记04- Selector详解 在你爬取网页的时候,最普遍的事情就是在页面源码中提取需要的数据,我们有几个库可以帮你完成这个任务: BeautifulSoup是python中一个非常流行 ...
- Scrapy笔记05- Item详解
Scrapy笔记05- Item详解 Item是保存结构数据的地方,Scrapy可以将解析结果以字典形式返回,但是Python中字典缺少结构,在大型爬虫系统中很不方便. Item提供了类字典的API, ...
- Scrapy笔记03- Spider详解
Scrapy笔记03- Spider详解 Spider是爬虫框架的核心,爬取流程如下: 先初始化请求URL列表,并指定下载后处理response的回调函数.初次请求URL通过start_urls指定, ...
- C++游戏服务器编程笔记 IP详解
C++游戏服务器编程笔记 IP详解 IP详解 INTERNET的历史 上世纪60年底起源于美国 1992年,Internet上的主机超过了100万台 现在已经是现代文明人的必需品 TCP/IP的 ...
- 配置文件详解和核心api讲解
一.配置文件详解 1.映射文件详解 1.映射配置文件的位置和名称没有限制. -建议:位置:和实体类放在统一目录下. 名称:实体类名称.hbm.xml. 2.在映射配置文件中,标签内的name属 ...
- Android学习笔记-Dialog详解
1.对话框的使用 1.1AlertDialog的显示 简单对话框以及监听的设置:重点掌握三个按钮(也就是三上单词): PositiveButton(确认按钮);NeutralButton(忽略按钮) ...
- Solr系列三:solr索引详解(Schema介绍、字段定义详解、Schema API 介绍)
一.Schema介绍 1. Schema 是什么? Schema:模式,是集合/内核中字段的定义,让solr知道集合/内核包含哪些字段.字段的数据类型.字段该索引存储. 2. Schema 的定义方式 ...
- Angular6 学习笔记——组件详解之组件通讯
angular6.x系列的学习笔记记录,仍在不断完善中,学习地址: https://www.angular.cn/guide/template-syntax http://www.ngfans.net ...
- Angular6 学习笔记——组件详解之模板语法
angular6.x系列的学习笔记记录,仍在不断完善中,学习地址: https://www.angular.cn/guide/template-syntax http://www.ngfans.net ...
随机推荐
- Java中LinkedList的fori和foreach效率比较
在<Java中ArrayList的fori和foreach效率比较>中对ArrayList的两种循环方式进行了比较,本次对LinkedList的两种遍历方式进行效率的比较. 1. list ...
- BZOJ3309 DZY Loves Math(莫比乌斯反演+线性筛)
一通正常的莫比乌斯反演后,我们只需要求出g(n)=Σf(d)*μ(n/d)的前缀和就好了. 考虑怎么求g(n).当然是打表啊.设n=∏piai,n/d=∏pibi .显然若存在bi>1则这个d没 ...
- 函数防抖与函数节流 封装好的debounce和throttle函数
/** * 空闲控制 返回函数连续调用时,空闲时间必须大于或等于 wait,func 才会执行 * * @param {function} func 传入函数,最后一个参数是额外增加的this对象,. ...
- Day22-中间件
1.中间件,在其它程序中,有的叫管道,有的叫http handler.下面是原生的中间件 2.自己也可以写中间件 2.1 写中间件,新建文件夹Middle,新建m1.py 2.2 在setting里注 ...
- 【刷题】BZOJ 2959 长跑
Description 某校开展了同学们喜闻乐见的阳光长跑活动.为了能"为祖国健康工作五十年",同学们纷纷离开寝室,离开教室,离开实验室,到操场参加3000米长跑运动.一时间操场上 ...
- 【python】爬虫实践
参考链接 https://blog.csdn.net/u012662731/article/details/78537432 详解 python3 urllib https://www.jianshu ...
- 洛谷 P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows 解题报告
P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows 题意: 给定一个长\(N\)的序列,求满足任意两个相邻元素之间的绝对值之差不超过\(K\)的这个序列的排列有多少个? 范围: ...
- sqlmap利用DNS进行oob(out of band)注入(转)
0x00 起因 实际案子的时候遇到了一个注入,过狗可以使用sqlmap,但是是基于时间的注入和限制频率需要使用--delay参数,本来就是延时再加上--delay等的心力憔悴.所有有了下面介绍使用 ...
- [SDOI2009] HH去散步 (矩阵乘法)
link $solution:$ 将边化为点后重新建矩阵,跑$T-1$幂即可(因为跑的是新边). 最后直接找与$x,y$所相连的边即可. #include<iostream> #inclu ...
- web服务器nginx和apache的对比分析
今天准备较详细的对比一下apache httpd与nginx两个web服务器的异同点.优缺点.由于我并不是做web开发的,所以有什么理解错误还请指出,想要了解它们是因为工作中有时候会用到它, ...