Hibernate系列之核心开发接口
一、概述
所有的hibernate应用中都会访问5个核心接口,它们分别是:
- Configuration:配置hibernate,创建SessionFactory对象
- SessionFactory:初始化hibernate,充当数据存储源的代理,创建Session对象
- Session:负责保存、更新、删除、加载和查询对象
- Transaction:管理事事务
- Query和Criteria:执行数据库查询
下面将对这五个接口进行逐一总结:
二、Configuration
一个Configuration的实例允许应用指定在创建一个SessionFactory时使用的属性和映射文件,通常一个应用将创建一个单独的Configuration,构建一个SessionFactory的单一实例然后实例化会话线程用于服务客户请求。Configuration仅仅是作为一个初始化时的对象,一个Configeration 实例代表Hibernate 所有Java类到Sql数据库映射的集合。
Configuration主要用于产生SessionFactory,进行配置信息的管理,可以在configure方法中指定hibernate文件。
在Hibernate 4之前的版本中,Configuration是通过下述方式产生SessionFactory的:
SessionFactory sf=new AnnotationConfiguration().configure().buildSessionFactory();
Hibernate 4以后,Configuration的buildSessionFactory方法被标记为过时,官方建议使用buildSessionFactory(ServiceRegistry sr)这个方法来获取SessionFactory。
Configuration configuration = new Configuration().configure();
ServiceRegistry sr=new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
SessionFactory sessionFactory = configuration.buildSessionFactory(sr);
三、SessoinFactory
SessionFactory的主要作用是产生和管理Session,通常情况下每一个应用只需要一个SessionFactory,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
一个SessionFactory的内部状态是不可变的,一旦创建了这个内部状态的内部设置便不再与Configuration对象关联,这种状态包括所有关于对象/关系映射数据。
SessionFactory在Hibernate中起到一个缓冲区的作用,它缓冲了Hibernate自动生成的SQL语句和一些其他的映射数据。
SessionFactory可以通过两种方法getCurrentSession()和openSession()产生Session,两种方法的区别有:
- openSession每次打开都是新的Session,并且需要人为的调用close方法关闭Session。
- getCurrentSession是从当前上下文中获取Session并且会绑定到当前线程,第一次调用会自动创建一个Session实例,如果未手动关闭多次获取的是同一个Session,事物提交或者回滚时会自动关闭Session。
- 使用getCurrentSession时,需要在配置文件中添加如下:
(1)如果使用的是本地事务(JDBC事务)
<property name="current_session_context_class">thread</property>
(2)如果使用的是全局事务(JTA事务)
<property name="current_session_context_class">jta</property>
备注:
全局事务:资源管理器管理和协调的事务,可以跨越多个数据库和进程。资源管理器一般使用XA 二阶段提交协议与“企业信息系统”(EIS) 或数据库进行交互。
本地事务:在单个 EIS或数据库的本地并且限制在单个进程内的事务。本地事务不涉及多个数据来源。
使用getCurrentSession()方法时,如果未配置上述属性,则会报错:
四、Session
Session用于管理一个数据库的任务单元(增、删、改、查),它是Java应用和Hibernate之间主要运行接口,是抽象持久性服务概念的主要API。
Session的生命周期是以一个逻辑事物的开始和结束为边界,Session的主要功能是提供创建、读取和删除映射的实体类的操作,实体可能存在于三种状态:
- 瞬时状态(transient)
即为普通的Java对象,此状态下,不与Session实例关联,在数据库中没有和瞬时对象关联的数据
2. 持久状态(persistent)
处于此状态的实例在数据库中对应的记录,并拥有一个持久化标识。持久状态的对象总是与Session和Transaction相关联,在一个Session中,对持久对象的改变不会马上对数据库进行变更,而是发生在Transaction终止,执行commit之后。
3. 游离状态(detached)
与持久状态的对象关联的Session被关闭后,该对象就变成游离状态,此状态下对游离对象的引用依然有效,也可以继续被修改。
这三种状态之间可以相互转换,如下图示:
Session中有一个缓存,被称为hibernate的第一季缓存,它存放被当前工作单元加载的对象,这块缓存中有一map,在执行save方法后,会生成一个id,这个id会保存在map的key中,与之对应的value值就是该是该对象的引用,执行commit()方法后,数据库就有对应这条数据了,此时该实体处于持久化状态,当执行完Session.close()后,处于托管状态。
区分这三种状态的关键在于:
- 有没有ID
- ID在数据库中有没有
- 在内存中没有
瞬时状态下,为内存中一个对象没有ID,缓存中也没有
持久化状态,内存有,缓存中有,数据库中也存在
托管状态:内存中有,缓存中没有,数据库中存在ID
Session接口有几个重要的方法:
save():持久化给出的瞬时状态的实体,并分配有一个ID标识符
@Test
public void test()
{
Session session=HibernateUtil.getSessionFactory().getCurrentSession();
Book b=new Book();
b.setBookName("Java");
b.setId(1);
b.setPrice(21);
session.beginTransaction();
session.save(b);
session.getTransaction().commit();
}
Delete():从数据库中删除持久化实体
@Test
public void test()
{
Session session=HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Book b=(Book) session.get(Book.class, 1);
session.delete(b);
session.getTransaction().commit();
}
load():返回给定标识符的实体类的持久化实例(假定实例存在),不能使用该方法来确定一个实例是否存在(使用get方法)
@Test
public void test()
{
Session session=HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Book b=(Book) session.load(Book.class, 1);
System.out.println(b.getBookName());
session.getTransaction().commit();
}
get():返回给定标识符的实体类的持久化实例或null(如果实例不存在)
@Test
public void test()
{
Session session=HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Book b=(Book) session.get(Book.class, 1);
session.getTransaction().commit();
System.out.println(b.getBookName());
}
get()和load()方法的区别:
- 当对应记录不存在时,使用load方法会报异常,而get方法会返回null
2. load返回的是代理对象,等到真正用到对象的内容时才发出sql语句,而get直接从数据库加载,不会延迟
update():更新指定标识符的托管状态实例为持久化状态,如果存在具有相同标识符的持久化实例,将会报异常
五、Transaction
Hibernate的Transaction是底层的JDBC Transaction或者JTA Transaction的封装,具体取决于在hibernate.properties中的配置。
一个典型的事务在创建完Session对象后即使用beginTransaction()启动事务,从此开始知道commit()之间的代码都会处于同一个事务中,这两个函数之间的所有的数据库代码都会在commit()执行时一次性提交,在提交时如果某一句代码执行出现异常,就会回滚这一次事务之间的所有执行代码。
六、Query
通过SessionFactory获得了session对象后,除了可以通过get(类名.class, id)方法得到相应的对象,还可以通过获得Query对象来取得需要的对象:
Query query = session.createQuery("查询语句如from UserBean");
List list = query.list();//得到一个集合
query.uniqueResult();//得到一个单个的对象
分页查询:
query.setFirstResult(位置);//表示从哪个位置开始查询,返回query对象
query.setMaxResult(记录条数);//表示当页共几条记录,返回一个集合
session.createQuery("select count(*) from 类名").uniqueResult();//得到记录总数
查询语句同sql查询语句很相像,只是将表名换作类名,字段名换作属性名,如果查询需要条件可以使用占位符来替换对应的属性名,也可以使用:变量名来作为占位符。
eg:
@Test
public void test1()
{
Session session=HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Query q=(Query) session.createQuery("from Person");
List<Person> persons=(List<Person>)q.list();
for(Person p:persons)
System.out.println(p.getName());
session.getTransaction().commit();
}
public void test2()
{
Session session=HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Query q=(Query) session.createQuery("select count(*) from Person");//得到记录总数
int count=((Long)q.uniqueResult()).intValue();
System.out.println(count);
session.getTransaction().commit();
}
Hibernate系列之核心开发接口的更多相关文章
- Hibernate 再接触 核心开发接口
1.可以重载方法进行配置文件的指定 sessionFactory = new AnnotationConfiguration().configure("hibernate.xml" ...
- HIbernate学习笔记(二) hibernate对象的三种状态与核心开发接口
1.在hibernate中持久化对象有三个状态,这个面试时可能会问到: (1)transient瞬时态:在数据库中没有与之匹配的数据,一般就是只new出了这个对象,并且在session缓存中也没有即此 ...
- Hibernate学习笔记2.5(Hibernate核心开发接口和三种状态)
1.configuration(配置信息管理,产生sessionfactory) sessionfactory管理一系列的连接池 opensession 永远打开新的,需要手动close getcur ...
- hibernate(五)核心开发接口与对象的三种状态
本文链接:http://www.orlion.ml/37/ 一.Configuration 1.AnnotationConfiguration 2.进行配置信息的管理 3.configure()方法通 ...
- Hibernate核心开发接口_SessionFactory详解
SessionFactory: a) 用来产生和管理Session b)通常情况下每个应用只需要一个SessionFactory c)除非要访问多个数据库的情况 d) 关注两个方法即: openS ...
- hibernate核心开发接口_Configuration
AnnotationConfiguration继承自Configuration,这里以AnnotationConfiguration为例: new AnnotationConfiguration(). ...
- 5.Hibernate 核心开发接口
一.Configuration(AnnotationConfiguration) 作用:进行配置信息的管理 目标:用来产生SessionFactory 可以在configure 方法中指定hibern ...
- Maven系列第9篇:多环境构建支持,核心开发必备!
maven系列目标:从入门开始开始掌握一个高级开发所需要的maven技能. 这是maven系列第9篇. 整个maven系列的内容前后是有依赖的,如果之前没有接触过maven,建议从第一篇看起,本文尾部 ...
- Hibernate(三)__核心接口和类
该图显示了核心接口类以及配置文件的关系层次,越往下越偏向底层数据库. 1. hibernate.cfg.xml文件 ①该文件主要用于指定各个参数,是hibernate核心文件 ②默认放在src目录下, ...
随机推荐
- SAP OBYC自动记账的实例说明 +VALUE STRING
对Value String定义:定义了一系列的步骤优先顺序,每一个步骤都连接到不同的过账事务码,而这个顺序本身就称作价值串.价值串你可以看作是一种记账的规则,为物料移动或者发票校验包含了一系列的科目分 ...
- git patch 使用
使用git的时候,需要删除几个id,会对到之前的代码,但又想保留现在的代码,以便后面从新合并,所以就将现在的代码打包成patch,留到下次合并. 参考链接 http://www.jianshu.com ...
- Spring JDBC JdbcTemplate类示例
org.springframework.jdbc.core.JdbcTemplate类是JDBC核心包中的中心类.它简化了JDBC的使用,并有助于避免常见的错误. 它执行核心JDBC工作流,留下应用程 ...
- HTTP 错误 500.19 配置文件错误 ( 0x8007000d,0x80070032)
HTTP 错误 500.19 - Internal Server Error无法访问请求的页面,因为该页的相关配置数据无效. 详细错误信息模块 IIS Web Core 通知 未知 处理程序 尚未确定 ...
- Git介绍及安装配置
一.概述 1.1git概念 Git是一个开源的分布式版本控制系统,用于敏捷高效处理任意规模的项目,其作者为Linux创造者Linus Torvalds为管理Linux内核而开放的一个开源的版本控制柔软 ...
- Unity3D Shader基础教程
原文地址:http://bbs.9ria.com/thread-212557-1-1.html 此教程将指引你如何建立自己的Shaders,让你的游戏场景看起来更好.Unity配备了强大的阴影和材料的 ...
- springmvc接口ios网络请求
springmvc: application/json;charset=utf-8的ios网络请求: 后台使用 @RequestBody注解参数接收:
- IE10假死/未响应是为什么?
不知道大家在使用IE10的时候会不会有像是假死一样的情况发生,在打开网页或者进行任何操作都会变得奇慢无比.随着最近在网上看视频的次数越来越多,这个问题越来越突出,越来越频发.于是分析进程的等待链,看看 ...
- tomcat启动时设定环境变量
在tomcat的bin目录中修改startup.bat 设置CATALINA_HOME set "CATALINA_HOME=F:\solr\apache-tomcat\apache-tom ...
- JS判断设备类型跳转至PC端或移动端相应页面
if((navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobil ...