Hibernate5-课程笔记3
详解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的更多相关文章
- Linux内核分析课程笔记(一)
linux内核分析课程笔记(一) 冯诺依曼体系结构 冯诺依曼体系结构实际上就是存储程序计算机. 从两个层面来讲: 从硬件的角度来看,冯诺依曼体系结构逻辑上可以抽象成CPU和内存,通过总线相连.CPU上 ...
- (1/18)重学Standford_iOS7开发_iOS概述_课程笔记
写在前面:上次学习课程对iOS还是一知半解,由于缺乏实践,看公开课的视频有时不能很好地领会知识.带着问题去学习永远是最好的方法,接触一段时间iOS开发以后再来看斯坦福iOS公开课,又会有许多新的发现, ...
- Andrew Ng机器学习课程笔记(五)之应用机器学习的建议
Andrew Ng机器学习课程笔记(五)之 应用机器学习的建议 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7368472.h ...
- Andrew Ng机器学习课程笔记--week1(机器学习介绍及线性回归)
title: Andrew Ng机器学习课程笔记--week1(机器学习介绍及线性回归) tags: 机器学习, 学习笔记 grammar_cjkRuby: true --- 之前看过一遍,但是总是模 ...
- Andrew Ng机器学习课程笔记--汇总
笔记总结,各章节主要内容已总结在标题之中 Andrew Ng机器学习课程笔记–week1(机器学习简介&线性回归模型) Andrew Ng机器学习课程笔记--week2(多元线性回归& ...
- Andrew 机器学习课程笔记
Andrew 机器学习课程笔记 完成 Andrew 的课程结束至今已有一段时间,课程介绍深入浅出,很好的解释了模型的基本原理以及应用.在我看来这是个很好的入门视频,他老人家现在又出了一门 deep l ...
- 操作系统学习笔记----进程/线程模型----Coursera课程笔记
操作系统学习笔记----进程/线程模型----Coursera课程笔记 进程/线程模型 0. 概述 0.1 进程模型 多道程序设计 进程的概念.进程控制块 进程状态及转换.进程队列 进程控制----进 ...
- 《CSS动画实用技巧》课程笔记
概述 这是我学习[CSS动画实用技巧][1]的课程笔记 常用动画属性--transition [常用动画属性--transition][2] .change img{ display:block; w ...
- Deeplearning.ai课程笔记--汇总
从接触机器学习就了解到Andrew Ng的机器学习课程,后来发现又出来深度学习课程,就开始在网易云课堂上学习deeplearning.ai的课程,Andrew 的课真是的把深入浅出.当然学习这些课程还 ...
- selenium课程笔记
selenium课程笔记第一天(2017-7-1) 一.配置火狐浏览器 运行:firefox.exe -p -no -remote selenium课程笔记第二天 用Eclipse+java+sele ...
随机推荐
- 《linux内核完全剖析》笔记03-进程创建
根据一下问题来看笔记 进程占多大的线形地址空间 进程实际分配多少物理内存 创建进程的开销在哪里 一. 从fork系统调用开始 kernel/sys_call.s第222行 _sys_fork: cal ...
- oracle ebs 分类账与法人主体对应关系
--ebs 分类账与法人主体对应关系 SELECT A.SET_OF_BOOKS_ID LEDGER_ID, GL.NAME LEDGER_NAME, GL.CURRENCY_CODE, FFV.FL ...
- UITabelview的删除
删除的效果 Automatic Bottom Fade left middle none right top 简单删除 先删除数据源里的数据,然后再删除cell,否者会报错 let indexPath ...
- .Net 生成条形码
1,下面一个类,可以直接复制下去使用: public class Code39 { private Hashtable m_Code39 = new Hashtable(); ...
- (五)python的发展历史
1989年,为了打发圣诞节假期,Guido开始写Python语言的编译器.Python这个名字,来自Guido所挚爱的电视剧Monty Python's Flying Circus.他希望这个新的叫做 ...
- Linux软件安装管理 - CentOS (三)
1. 软件包管理简介 2. rpm命令管理(Redhat Package Manager) 3. yum在线安装 4. 源码包管理 4.1 源码包和RPM包的区别 4.1.1 区别 安装前:概念上的区 ...
- 关于preg_match()函数的一点小说明
int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $ ...
- 批处理+组策略 实现规定时间段无法开机and定时关机
某爱熬夜的人对付自己的东西 1.shutdown命令 shutdown -a #取消现有的shutdown计划 shutdown -s -t [time] #设定时间关机 shutdown -r -t ...
- 使用Gradle编译release apk报错:Please correct the above warnings first
在开发SDK的过程中,遇到了一个研发,使用了自己的SDK之后遇到了各种问题,于是我们自己帮忙接入. 所有代码都接入完成之后,准备export出一个release包,但是此时却报错: 此时出现了很多的w ...
- SpringMVC Memcached 搭建WEB项目缓存框架
最近做的项目一直在使用memcached作为缓存来缓存各种数据,现在BOSS要在项目上加上缓存.并把任务交给我.便琢磨怎么解决这个问题. 看了很多文章,写的比较详尽靠谱的就是这篇了http://www ...