详解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的更多相关文章

  1. Scrapy笔记04- Selector详解

    Scrapy笔记04- Selector详解 在你爬取网页的时候,最普遍的事情就是在页面源码中提取需要的数据,我们有几个库可以帮你完成这个任务: BeautifulSoup是python中一个非常流行 ...

  2. Scrapy笔记05- Item详解

    Scrapy笔记05- Item详解 Item是保存结构数据的地方,Scrapy可以将解析结果以字典形式返回,但是Python中字典缺少结构,在大型爬虫系统中很不方便. Item提供了类字典的API, ...

  3. Scrapy笔记03- Spider详解

    Scrapy笔记03- Spider详解 Spider是爬虫框架的核心,爬取流程如下: 先初始化请求URL列表,并指定下载后处理response的回调函数.初次请求URL通过start_urls指定, ...

  4. C++游戏服务器编程笔记 IP详解

    C++游戏服务器编程笔记 IP详解 IP详解 INTERNET的历史 上世纪60年底起源于美国 1992年,Internet上的主机超过了100万台 现在已经是现代文明人的必需品    TCP/IP的 ...

  5. 配置文件详解和核心api讲解

    一.配置文件详解 1.映射文件详解 1.映射配置文件的位置和名称没有限制. -建议:位置:和实体类放在统一目录下.  名称:实体类名称.hbm.xml.    2.在映射配置文件中,标签内的name属 ...

  6. Android学习笔记-Dialog详解

    1.对话框的使用 1.1AlertDialog的显示 简单对话框以及监听的设置:重点掌握三个按钮(也就是三上单词): PositiveButton(确认按钮);NeutralButton(忽略按钮) ...

  7. Solr系列三:solr索引详解(Schema介绍、字段定义详解、Schema API 介绍)

    一.Schema介绍 1. Schema 是什么? Schema:模式,是集合/内核中字段的定义,让solr知道集合/内核包含哪些字段.字段的数据类型.字段该索引存储. 2. Schema 的定义方式 ...

  8. Angular6 学习笔记——组件详解之组件通讯

    angular6.x系列的学习笔记记录,仍在不断完善中,学习地址: https://www.angular.cn/guide/template-syntax http://www.ngfans.net ...

  9. Angular6 学习笔记——组件详解之模板语法

    angular6.x系列的学习笔记记录,仍在不断完善中,学习地址: https://www.angular.cn/guide/template-syntax http://www.ngfans.net ...

随机推荐

  1. Cron表达式简单的介绍

    1.Cron是什么,用来做什么的 根据百度百科的解释:计划任务,是任务在约定的时间执行已经计划好的工作,这是表面的意思.在Linux中,我们经常用到 cron 服务器来完成这项工作.cron服务器可以 ...

  2. [Offer收割]编程练习赛23-freeloop

    A. H国的身份证号码I dfs裸题. 时间复杂度\(O(n^k)\). #include <bits/stdc++.h> #define FOR(i,a,b) for (int i=a; ...

  3. Django 2.0 学习(19):Django 分页器

    Django 分页器 要使用Django实现分页功能,必须从Django中导入Paginator模块(painator - 分页器) views.py from django.shortcuts im ...

  4. mysql中while循环以及变量声明以及dilimiter

    首先我们查看一个正确的完整的一个存储过程 ①其中delimiter命令解释如下:默认情况下,delimiter是分号:.在命令行客户端中,如果有一行命令以分号结束,那么回车后,mysql将会执行该命令 ...

  5. Divisibility by 25 CodeForces - 988E(模拟)

    遇见模拟题 有两种做法 例如这题: 1.直接去算次数(统计哪个数在第几位,然后去运算) 2.模拟操作 贴一个别人的代码...https://blog.csdn.net/weixin_39453270/ ...

  6. access数据库表导入到oracle

    1.本机安装access数据库 25M左右2.创建ODBC数据源,要选择oracle C:\Windows\SysWOW64\odbcad32.exe 3.打开要导入的 .mdb文件 右键表--> ...

  7. 【NOI2016】区间

    目链接:http://uoj.ac/problem/222 在数轴上有 n 个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间,使得这 m 个区间共同包含至少 ...

  8. 【Cf #449 C】Willem, Chtholly and Seniorious(set维护线段)

    这里介绍以个小$trick$,民间流传为$Old Driver Tree$,实质上就是$set$维护线段. 我们将所有连续一段权值相同的序列合并成一条线段,扔到$set$里去,于是$set$里的所有线 ...

  9. LGP4173残缺的字符串

    题解 由于有通配符,所以$kmp$失效了: 将通配符看成0,其余字符看成互不相同的数字,$A,B$串对应得到$a,b$数组; 定义: $f(p) = \sum_{i=0}^{m-1} a_{i}b_{ ...

  10. xampp+vscode开发php的配置流程

    一.所需文件 1.xampp集成服务器(个人使用7.1.7)https://www.apachefriends.org/download.html 2.vscode https://code.visu ...