hibernate.Session简介
★→→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会自动被关闭。
hibernate.Session简介的更多相关文章
- Hibernate核心技术简介
Hibernate核心技术简介 1.Hibernate映射文件开发 Hibernate映射文件就是项目中*.hbm.xml文件,其主要是完成各元素的配置,包括根元素.类元素.定义主键.设置主键 ...
- java框架之Hibernate(1)-简介及初使用
简介 hibernate 是一个开源 ORM ( Object / Relationship Mipping ) 框架,它是对象关联关系映射的持久层框架,它对 JDBC 做了轻量级的封装,而我们 ja ...
- Hibernate框架简介(二)基本使用增、删、改、查
一.Hibernate框架简介 Hibernate是一个优秀的Java持久化层解决方案,是当今主流的对象-关系映射(ORM,ObjectRelationalMapping)工具 1.1.理解持久化 瞬 ...
- Hibernate缓存简介和对比、一级缓存、二级缓存详解
一.hibernate缓存简介 缓存的范围分为3类: 1.事务范围(单Session即一级缓存) 事务范围的缓存只能被当前事务访问,每个事务都有各自的缓存,缓存内的数据通常采用相互关联的对象 ...
- 2.session 简介
2.session 简介 hibernate的执行流程, 创建一个配置对象Configuration,这个配置对象的作用就是用来读取配置文档Hibernate.cfg.xml 获得配置对象的目的是可以 ...
- org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not a ...
- Use Spring transaction to simplify Hibernate session management
Spring对Hibernate有很好的支持 DataSource ->SessionFactory-> HibernateTranscationManagerHibernate中通 ...
- Hibernate框架—简介
ORM对象/关系数据库映射 ORM全称Object/Relation Mapping,对象/关系数据库映射,可以理解成一种规范.该框架的基本特征:完成面向对象的编程语言到关系数据库之间的映射. ORM ...
- Could not open Hibernate Session for transaction;
javax.servlet.ServletException: org.springframework.transaction.CannotCreateTransactionException: Co ...
随机推荐
- js 中如何通过提示框跳转页面
通过提示框跳转页面 <!doctype html> <html lang="en"> <head> <meta charset=" ...
- 深度学习算法实践15---堆叠去噪自动编码机(SdA)原理及实现
我们讨论了去噪自动编码机(dA),并讨论了Theano框架实现的细节.在本节中,我们将讨论去噪自动编码机(dA)的主要应用,即组成堆叠自动编码机(SdA),我们将以MNIST手写字母识别为例,用堆叠自 ...
- 设置用户sudo -s拥有root权限
开通普通用户的ROOT权限,上线了可以禁止用户使用root权限 修改配置文件 vi etc/sudoers 在 root ALL=(ALL) ALL那么你就在下边再加一条配置:hjd ALL=( ...
- node 通过mongoose实现 mongodb的增删改
node 通过mongoose实现 mongodb的增删改 新建文件test.js 内容如下: var mongoose = require('mongoose') , Schema = mo ...
- Hadoop MapReduce Next Generation - Setting up a Single Node Cluster
Hadoop MapReduce Next Generation - Setting up a Single Node Cluster. Purpose This document describes ...
- 简单的网页采集程序(ASP.NET MVC4)
因为懒人太多,造成现在网页数据采集非常的流行,我也来写个简单的记录一下. 之前写了MVC的基本框架的搭建随笔,后面因为公司太忙,个人感情问题:(,导致不想写了,就写了两篇给删除了,现在就搁浅了, 本人 ...
- Java Fx-安装E(FX)CLIPSE IDE
安装E(FX)CLIPSE IDE 本文主要介绍如何在Eclipse Mars 4.5.0版本上安装e(fx)clipse. 本文中的介绍和截图使用了纯净安装的为RCP和RAP开发者准备的Eclips ...
- leetcode第八题 String to Integer (atoi) (java)
String to Integer (atoi) time=272ms accepted 需考虑各种可能出现的情况 public class Solution { public int atoi( ...
- jQuery实现iframe的自适应高度
假设我们在当前页面要嵌套一个iframe 1 <iframe id="myframe" src="test.html" height="240& ...
- bzoj 1761: [Baltic2009]beetle 区间dp
1761: [Baltic2009]beetle Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 255 Solved: 92[Submit][Statu ...