★→→SessionFactory (org.hibernate.SessionFactory)
包含已经编译的映射(mappings),是制造session的工厂,可能含有一些可以在各个事务(transaction)之间共享的数据
(1) SessionFactory的缓存
可分为两类:内置缓存和外置缓存。
SessionFactory的内置缓存中存放了Hibernate配置信息和映射元数据信息、同时也缓存了Hibernate自动生成的SQL语句等;
SessionFactory的外置缓存是一个可配置的缓存插件,在默认情况下,SessionFactory不会启用这个缓存插件。外置缓存
能存放大量数据库数据的拷贝,外置缓存的物理介质可以是内存或者硬盘。

(2) 只有一个数据存储源,只需创建一个SessionFactory
SessionFactory就是个重量级对象,如果应用只有一个数据存储源,只需创建一个SessionFactory实例,
因为随意地创建SessionFactory实例会占用大量内存空间。
但是当你的项目要操作多个数据库时,那你必须为每个数据库指定一个SessionFactory。
(3) Configuration的其他用法
Configuration的configure ()方法还支持带参数的访问方式,你可以指定hbm.xml文件的位置,而不是使用默认的classpath
下面的hibernate.cfg.xml这种方式,例如:
Configuration cfg = new Configuration().configure("myexample.xml");

★★→→Configuration
Configuration是hibernate的入口,在新建一个Configuration的实例的时候,hibernate会在classpath里面查找
hibernate.properties文件,如果该文件存在,则将该文件的内容加载到一个Properties的实例GLOBAL_PROPERTIES里面,如果不存在,将打印信息:hibernate.properties not found
然后是将所有系统环境变量(System.getProperties())也添加到GLOBAL_PROPERTIES里面。如果hibernate.properties文件存在,系统还会验证一下这个文件配置的有效性,对于一些已经不支持的配置参数,系统将打印警告信息。
(1) 作用---实现对Hibernate进行配置
? Configuration接口的作用是对Hibernate进行配置,以及对它进行启动
在Hibernate的启动过程中,Configuration类的实例首先定位映射文档的位置,读取这些配置,然后创建一个SessionFactory对象。
? 根据Configuration对象创建一个SessionFactory对象
为了能创建一个SessionFactory对象,你必须在Hibernate初始化时创建一个Configuration类的实例,并将已写好的映射文件交由它处理。
这样,Configuration对象就可以创建一个SessionFactory对象,当SessionFactory对象创建成功后,Configuration对象就没有用了,你可以简单地抛弃它。

(2) 它是启动hibernate的对象
虽然Configuration接口在整个Hibernate项目中只扮演着一个很小的角色,但它是启动hibernate时你所遇到的第一个对象。

(3) Configuration config = new Configuration();
config.addClass(Customer.class);
sessionFactory = config.buildSessionFactory();
或者:
使用方法链编程风格,可以改写为:
sessionFactory = new Configuration().buildSessionFactory().addClass(Customer.class).buildSessionFactory();
注意:
方法链编程风格能使应用程序代码更加简捷。在使用这种编程风格时,最好把每个调用方法放在不同的行,否则在跟踪程序时,无法跳入每个调用方法中。

★★★→→Session(org.hibernate.Session)
(1) 单线程的,短寿命的对象,代表了一次会话的过程。实际上是把一个JDBC Connection打包
了,它可以包含一些持久化对象的缓存看作介于数据连接与事物管理一种中间接口.
在hibernate的设计者中.他们将session看作介于数据连接与事物管理的一种中间接口或者想象成一个持久对象的缓冲区
hibernate能检测到这些持久对象的改变,并及时刷新数据库

(2) 每一个Session实例和一个数据库事务绑定
通常将每一个Session实例和一个数据处理库事务绑定
就是说,每执行一个数据库事务(操作),都应该先创建一个新的Session实例.
如果事务执行中出现异常,应该撤消事务.
不论事务执行成功与否,最后都应该调用Session的close()方法,从而释放Session实例占用的资源.

(3) 如何获得Session对象
首先创建SessionFactory对象
应用服务器如果访问多个数据源时,则应该产生多个SessionFactory;
但是仅仅为了服务与某个请求时,不要创建一个新的SessionFactory,因为创建SessionFactory需要消耗大量的资源.
然后根据SessionFactory再创建Session对象
例如:::::
----------------------------------------------------------------------------------
Session session=sessionFactory.openSession();
Transaction tx;
try{
    tx=session.beginTransaction();//开始一个事务
    .......//执行事务
    tx.commit(); 
}catch(Exception e){//如果出现异常就撤消事务
    if(tx!=null)
     tx.rollback();
    throw e;
}
finally//不管事务执行成功与否,最后都关闭Session并且放在finally中以提高安全性
    session.close();
-----------------------------------------------------------------------------------
(4) Session 接口中的常用方法
基本的CURD操作(save()方法:把Java对象保存数据库中、update()方法:更新数据
库中的Java对象、delete()方法:把Java对象从数据库中删除、load()方法:从数据
库中加载Java对象 和find()方法:从数据库中查询Java对象);执行查询;

◆ save()方法:save() 和persist()方法产生SQL INSERT
session = HibernateUtil.currentSession();
        tx = session.beginTransaction();
        Book oneBook = new Book();     
oneBook.setBookName(new String("J2EE应用开发".getBytes("gb2312"), "ISO8859-1"));
        oneBook.setBookKind('1');
        oneBook.setBookPrice(7.4f);
        session.save(oneBook);
        tx.commit();
◆? Session 接口中的常用方法---- updata()和merge()方法产生SQL UPDATE
该方法调用Session的load()方法,加载Customer对象,然后再修改Customer对象的属性。
       session = HibernateUtil.currentSession();
        tx = session.beginTransaction();
        Book oneBook=(Book)session.load(Book.class,bookID);
oneBook.setBookName(new String("Java应用开发".getBytes("gb2312"), "ISO8859-1"));
        oneBook.setBookKind('1');
        oneBook.setBookPrice(10.4f);
        tx.commit();

◆? Session 接口中的常用方法---- load和get方法
session的load和get方法根据给定的OID从数据库中加载一个对象,load方法在没有找    到对象时抛出notFoundException异常,get方法返回null;
get和load和其他查询方法返回的对象位于session的缓存中,修改了对象的属性后,    session清理缓存时,会根据持久化对象的属性来更新数据库。
用来对数据库中检索对象,load()和get()方法按照给定的OID加载一个持久化对象
public Iterator getAllCourses()throws HibernateException
{
String queryString = "select courses from Course as courses";
beginTransaction();
Query query = session.createQuery(queryString);
Iterator it= query.iterate();
return it;
}

public Iterator getSomeCourse(String name)throws HibernateException
{
String queryString = "select c from Course as c where c.name like :name" ;
beginTransaction();
Query query = session.createQuery(queryString);
query.setString("name", "%"+name+"%");
Iterator it= query.iterate();
return it;
}

◆? Session 接口中的常用方法---- delete()方法产生SQL DELETE
由于从数据库中删除对象对应的记录,如果出入的是持久化对象session就计划执行一个delete语句。
如果出入的参数是游离态对象,先使它成为持久化对象,然后计划执行一个delete语句。session只有在清理缓存的时候才会执行delete语句。
只有当调用session的close()方法时才会从session的缓存中删除对象。
session = HibernateUtil.currentSession();
        tx = session.beginTransaction();
        Book oneBook=(Book)session.load(Book.class,bookID);
        session.delete(oneBook);
        tx.commit();

★★★★→→Transaction
★★★★★→→Query查询对象
Query接口让你方便地对数据库及持久对象进行查询,它可以有两种表达方式:HQL语言或本地数据库的SQL语句。
Query经常被用来绑定查询参数、限制查询记录数量,并最终执行查询操作。

Query query=session.createQuery();
List list = query.list();//把query查询对象放到Query的list里面,返回一个query对象

★★★★★★→→Callback 方面的接口
当一些有用的事件发生时――例如持久对象的载入、存储、删除时,Callback接口会通知Hibernate去接收一个通知消息---它允许应用程序能对一些事件的发生作出相应的操作。例如Interceptor、Lifecycle和Validatable都是这一类接口。一般而言,Callback接口在用户程序中并不是必须的,但你要在你的项目中创建审计日志时,你可能会用到它。

◎第一步.---->获取Sessionfactory对象
Sessionfactory sf=new Configuration().configure().buildSessionFactory();
◎第二步.---->创建session对象
Session session=sf.openSession();
◎第三步.---->获取对数据库操作前的事物对象
Transaction tx=session.beginTransaction();
◎第四步.---->利用session的多个方法进行数据操作.例如:session.save(实体bean对象);session.update(实体bean对象)等;
◎第五步.---->tx.commit();保存持久化数据库操作;

◎ 数据其他操作.比如查询Query query=session.createQuery("from student where username='"+username"'");//student为一个实体bean对象.就是与hbm.xml对应的和数据库映射的一个 javabean.

其他接口:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

?           主键的生成 (IdentifierGenerator 接口)
?           本地SQL语言支持 (Dialect 抽象类)
?           缓冲机制 (Cache 和CacheProvider 接口)
?           JDBC 连接管理 (ConnectionProvider接口)
?           事务管理 (TransactionFactory, Transaction, 和 TransactionManagerLookup 接口)
?           ORM 策略 (ClassPersister 接口)
?           属性访问策略 (PropertyAccessor 接口)
?           代理对象的创建 (ProxyFactory接口)

★★★★★★★→→Session的获取与管理

  1,sessionFactory.openSession(),需要手动关闭session;

  2,若hibernate与spring整合后,需要配置加入spring提供的事务管理机制,例如加上@Transactional,才能通过sessionFactory.getCurrentSession()获取当前线程绑定的Session,之后无须手动关闭session。简单来说,Spring的Session总是与某个线程绑定的,而这个线程往往就是承载Servlet或Jsp的那个线程,也就是说,它的生命周期scope是request的,线程结束之前,与线程绑定的session会自动被关闭。

转载于:https://www.cnblogs.com/liwendeboke/p/6225683.html

hibernate.Session简介相关推荐

  1. hibernate框架简介

    目录 一. 历史与背景 1. 应用程序的分层体系结构 2.   持久化层(如图1右) (1)什么叫持久化? (2)什么叫持久层? (3)为什么要持久化?增加持久层的作用是什么? (4)目前在持久化层领 ...

  2. Hibernate Session的delete()方法

    本文介绍Hibernate Session的delete()方法.delete()方法用于从数据库中删除与Java对象对应的记录.对应游离对象和持久化对象,delete语句会做出不同的反应. dele ...

  3. Could not open Hibernate Session for transaction;

    javax.servlet.ServletException: org.springframework.transaction.CannotCreateTransactionException: Co ...

  4. Cookie和Session简介与区别

    1.Cookie和Session简介与区别 在非常多时候,我们需要跟踪浏览者在整个网站的活动,对他们身份进行自动或半自动的识别(也就是平时常说的网站登陆之类的功能),这时候,我们常采用Cookie与 ...

  5. Spring下没有配置事务导致hibernate session报错

    2019独角兽企业重金招聘Python工程师标准>>> org.hibernate.HibernateException: No Hibernate Session bound to ...

  6. Hibernate Session get()vs load()的区别

    Hibernate Session get()vs load()的区别 Hibernate Session提供了从数据库中获取数据的不同方法.其中两个是 - get()和load().我们还可以在不同 ...

  7. Hibernate Session merge,update,save,saveOrUpdate,persist

    Hibernate Session merge,update,save,saveOrUpdate,persist Hibernate Session是java应用程序和hibernate框架之间的接口 ...

  8. Hibernate Session get()vs load()实例差异

    Hibernate Session provide different methods to fetch data from database. Two of them are – get() and ...

  9. Hibernate Session合并,更新,保存,saveOrUpdate,持久化示例

    Hibernate Session is the interface between java application and hibernate framework. Today we will l ...

  10. Could not open Hibernate Session for transaction, 数据库连接超时解决方法

    异常: javax.servlet.ServletException: org.springframework.transaction.CannotCreateTransactionException ...

最新文章

  1. Could not GET “XXXXX.xml”Received status code 400
  2. 谨慎对待switch,用Object对象替换switch
  3. php yii2 获取表里最大的id_Yii2中自带分页类实现分页
  4. Facade(外观模式)
  5. Java 9 新功能之 HTTP2 和 REPL
  6. 数据库高级知识——索引优化分析(一)
  7. 八大编程语言之父:爸爸们节日快乐!
  8. Linux CentOS 7 Apache Tomcat 7 安装与配置
  9. Linux实操篇②(远程连接Linux;Xshell 6 和 Xftp 6 工具的安装;Xshell 6 和 Xftp 6 工具的配置和使用;)
  10. 简单python代码讲解-【第一期】用pycharm来编写简单代码(python教程)
  11. Java中的设计模式【我终于懂设计模式了】
  12. 微博除夕日活达1.34亿 借阿里云化解流量洪峰
  13. 学术汇报(academic presentation)/PPT应该怎么做?
  14. 彻底删除卸载2345安全卫士及2345浏览器
  15. linux git版本更新
  16. 粒子群优化能做相机标定吗
  17. 挑战程序设计竞赛(算法和数据结构)——14.1互质的集合(并查集)的JAVA实现
  18. css3 云朵飘动效果动画
  19. SDN在低带宽战术通信场景下的应用
  20. TDSQL-C PostgreSQL(CynosDB) 内核解密-披荆斩棘,勇往直前的腾讯云数据库

热门文章

  1. 达观杯文本分类——基于N-gram和LogisticRegression
  2. Kejin Game UVALive - 7264 (最大流转最小割)
  3. Excel中CONCATENATE函数生成SQL insert 语句
  4. Linux运维文档之nginx
  5. Chrome 开发者工具网络性能使用
  6. JavaScript判断浏览器类型及版本(新增IE11)
  7. PHP正则表达式转义符对照
  8. 不要老谈“设计模式”
  9. 智能驾驶的深度神经网络模型嵌入式部署的线路思考
  10. ‘catkin_make‘ is currently not installed问题修复