Hibernate常用接口
Hibernate的接口类型
在了解了Hibernate的基本配置,映射文件后,道路已经铺平了。我们继续往前走。接下来,我们应该做的是了解Hibernate常用的接口,对Hibernate的工作方式进一步熟悉,为我们下一步的编码做好充分的准备。
ORM是复杂的,可以看看Hibernate发布里的javadoc,100+MB。如果我们单单去阅读它的API,估计一年你才能看完。然而,我们仅仅是使用他,并不需要对它了解的十分完全。我们只需要了解它的常用核心类和接口就行了。就像数据库是非常复杂的,然而我们仅仅是使用它,又不需要关心它的底层实现,建表还是很easy的。
同样Hibernate在设计的时候,也考虑到广大使用者,因此它的API接口设计还是相对简单的。Hibernate的接口大致可以分为以下几种类型:
基本操作类:用来完成对数据库增、删、改、查的接口。例如:Session、Transaction和Query;
配置类:Hibernate用例读取配置文件和映射文件的接口。例如:SessionFactory、Configuration;
回调接口:它允许应用程序能对一些事件的发生作出相应的操作。例如:Interceptor、Validatable;
扩展映射机制接口:UserType、CompositeUserType、IdentifierGenerator
Hibernate六个常用接口
Hibernate的类非常多,但我们常用的也就六个,分别是:
Configuration、SessionFactory、Session、Transaction、Query、Criteria。这六个核心接口是我们必须了解和掌握的。通过这六个接口,我们可以完成对数据的基本操作,包括增、删、改、查,还有事务控制。
这六个接口之间的产生关系如下:

Configuration类
org.hibernate.cfg.Configuration接口的作用是对Hibernate进行配置,以及对它进行启动。在Hibernate的启动过程中,Configuration类的实例首先读取Hibernate配置文件,加载配置信息,然后加载映射文件,创建一个SessionFactory对象。
实例被设计成启动期间(startup-time)对象,一旦SessionFactory 创建完成它就被丢弃了。
要使用一个Configuration对象,要为它设置两个方面的内容:
- 数据库连接属性
- hbm.xml或pojo类
Configuration常用操作函数
1.加载Hibernate配置文件
Configuration cfg=new Configuration().configure("/etc/hibernate.cfg.xml");
或者
Configuration cfg=new Configuration().configure("/etc/hibernate.properties");
2.为Configuration指定映射文件
cfg.addResource("test/User.hbm.xml");
3.为Configuration指定POJO类,Order.hbm.xml根Order.java一个目录
cfg.addClass(test.Order.class);
4.为Configuration指定Hibernate配置属性,当然我们加载了配置文件就不能使用这个方法了。
Configuration cfg = new
Configuration()
.addClass(test.User.class)
.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect")
.setProperty("hibernate.connection.datasource", "java:comp/env/jdbc/test")
.setProperty("hibernate.order_updates", "true");
5.获得SessionFactory
SessionFactory sessions = cfg.buildSessionFactory();
当所有映射定义被 Configuration 解析后,应用程序必须获得一个用于构造org.hibernate.Session 实例的工厂SessionFactory。这个工厂将被应用程序的所有线程共享,线程安全的全局对象,只需要被实例化一次。单例模式。
Hibernate 允许你的应用程序创建多个SessionFactory 实例。这对使用多个数据库的应用来说很有用。
SessionFactory接口
Hibernate 的SessionFactory是一个关联于特定数据库全局的工厂(factory)。如果你要使用多个数据库,就要用多个的SessionFactory,通常把它们放在多个配置文件(Hibernate.cfg.xml)中(为了更容易启动)。
SessionFactory不是轻量级的对象,它包含与指定数据连接各种配置信息,是个线程安全的全局对象,只需要被实例化一次。我们不应该在应用程序中多次实例化它。
Session接口
Session接口是我们最常用的一个接口。但Session是一个轻量级的类,创建和销毁它并不会占用很多资源。请注意,Session对象是非线程安全的,因此在你的设计中,最好一个线程只创建一个Session对象。
Session主要用来管理对数据库进行的操作,包括开启一个事务、存取对象、执行查询。一般可以将Session看成一个对象的缓冲区或持久层管理器,当持久对象被Session管理后,Hibernate在事务提交时能够自动检测缓冲区的持久化对象是否已经改变,也就是说持久化对象所携带的信息是否发生了改变(脏数据检查),然后与数据库进行同步操作。
对象的三种状态,其实这里指对象与Session关系的三种状态:
Transient(自由状态):不曾进行持久化,数据库中没记录,也就是说没有与Session发生过关联。
Persistent(持久状态):持久的实例在数据库中有对应的记录,并且在Session的缓存中。
Detached(游离状态):持久的实例在数据库中有对应的记录,但不在Session的缓存中。也就是说曾经与Session发生过关联。
三种状态的转化:

这让我想到了一个恰当的比喻:对象和Session的关系就像我们与大学的关系:
自由状态是我们没上大学;
持久状态是我们已经被录取,并且在就读;
游离状态是我们已经毕业了,飞走了,但你依然是你母校的学生!
当然,你可以选择再次深造!
Transaction接口
这个API是可选的,我们可以选择使用该类来添加事务支持。它是对实际事务实现的一个抽象,这些实现包括JDBC事务、JTA中的UserTransaction、甚至是CORBA事务。之所以这样设计,是为了开发者能够使用一个统一的事务操作界面,是的自己的项目可以在不同的环境和容器之间方便的移植。
一个典型的事务应该使用下面的形式,beginTransaction()到commit()之间的代码处在同一个事务:
beginTransaction()开启事务;
commit()提交事务;
rollback()在发生异常时回滚事务。
下面的session使用sessionFactory.openSession()方式取的:
Transaction tx = null;
try {
tx = session.beginTransaction();
// do some work
tx.commit();
} catch (RuntimeException e) {
if (tx != null)
tx.rollback();
throw e; // or display error message
} finally {
session.close();
}
下面的session使用sessionFactory.getCurrentSession()方式取的:
Transaction tx = null;
try {
tx = session.beginTransaction();
// do some work
tx.commit();
} catch (RuntimeException e) {
tx.rollback();
throw e; // or display error message
}
Query和Criteria接口
这两个接口负责执行各种查询,它可以使用HQL和SQL语句两种表达方式。由Session创建并执行。
Criteria接口与Query接口非常类似,它允许创建并执行面向对象的标准化查询。
数据库操作中查询是使用最频繁的,是非常重要的一块,我们在以后详细讨论。
Hibernate常用接口的更多相关文章
- Java实战之02Hibernate-01简介、常用接口、CRUD操作
一.Hibernate简介 1.Hibernate在开发中所处的位置 2.ORM映射 Object :面向对象领域的 Relational:关系数据库领域的 Mapping:映射 Object: Re ...
- Hibernate常用API以及使用说明
1===>Hibernate常用的aip有Configuration,SessionFactory,Transaction,Session Configuration主要用于加载配置文件,使用 ...
- Hibernate常用查询语句
Hibernate常用查询语句 Hib的检索方式1'导航对象图检索方式.通过已经加载的对象,调用.iterator()方法可以得到order对象如果是首次执行此方法,Hib会从数据库加载关联的orde ...
- ( 转)Hibernate常用API
http://blog.csdn.net/yerenyuan_pku/article/details/65103203 可在度娘上摘抄如下文字: Hibernate的核心类和接口一共有6个,分别为:S ...
- CSharpGL(2)设计和使用场景元素及常用接口
CSharpGL(2)设计和使用场景元素及常用接口 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立的Demo,更适合入 ...
- JDBC常用接口详解
JDBC中常用接口详解 ***DriverManager 第一.注册驱动 第一种方式:DriverManager.registerDriver(new com.mysql.jdbc.Driver()) ...
- Servlet API遍程常用接口和类
本文主要总结Servlet API遍程常用接口和类 Servlet API http://tomcat.apache.org/tomcat-5.5-doc/servletapi/index.html ...
- hibernate核心接口,和扩展接口。回顾笔记,以前没记,现在补上,纯手工敲的。
hibernate核心接口: 所有的hibernate应用都会访问hibernate的5个核心接口 1,Configuration接口 Configuration用于配置并且根启动Hibernate. ...
- 液晶常用接口“LVDS、TTL、RSDS、TMDS”技术原理介绍
液晶常用接口“LVDS.TTL.RSDS.TMDS”技术原理介绍 1:Lvds Low-Voltage Differential Signaling 低压差分信号 1994年由美国国家半导体公司提出之 ...
随机推荐
- SGU 246. Black & White(数论)
题意: 有2*n-1个黑色和白色的珠子组成的环形项链,求至少需要多少颗黑色珠子才能使任意排列的项链中都存在两个黑珠间有n个珠子. (2*n-1<=2^31-1); Solution: 先分析n= ...
- PHP 单一入口
单一入口概述 单一入口的应用程序就是说用一个文件处理所有的HTTP请求,例如不管是列表页还是文章页,都是从浏览器访问index.php文件,这个文件就是这个应用程序的单一入口. 打个比方,大家都要上W ...
- php的各种配置
问题:1.如果去掉URL_MODEL=1时的index.php第一步:把Apache配置文件中的LoadModule rewrite_module modules/mod_rewrite.so 取消注 ...
- 发现一款移动web端远程调试工具weinre , 哈哈!
之前调试一直用的是chrome的远程调试,虽然效果很不错,但是在调试cordova,微信时多有不便. 在git上找工具时发现了这个:weinre,使用方法非常简单 附上git地址: https://g ...
- 开发中遇到的angularJs的小问题
1.在使用自定义指令后如果需要将指令内部的数据传给外层controller需要设置scope属性,此时注意,如果指令内传出的数据在某种情况下需要清空,如传出一个选中元素的数组,点击清空按钮则清空选中这 ...
- session与cookie的区别,有哪些不同之处
session与cookie的区别,根据自己的理解总结如下: (1)cookie是一种客户端的状态管理技术,将状态写在 浏览器端,而session是一种服务器端的状态管理技术,将 状态写在web服务器 ...
- Delphi 停靠技术的应用
一.基础知识介绍 1.VCL组件的基础知识 在TWinControl类中有一个DockSite属性(boolean),它的作用是是否允许别的控件停靠在它的上面:在TControl类中有一个DragKi ...
- QFTP走了以后QNetworkAccessManager出现了
QNetworkAccessManager Class Header: #include <QNetworkAccessManager>qmake: QT += networ ...
- 学习Swift -- 协议(上)
协议(上) 协议是Swift非常重要的部分,协议规定了用来实现某一特定工作或者功能所必需的方法和属性.类,结构体或枚举类型都可以遵循协议,并提供具体实现来完成协议定义的方法和功能.任意能够满足协议要求 ...
- JSP特点
建立在servlet规范功能之上的动态网页技术. JSP文件在用户第一次请求时,会被编译成servlet,然后由servlet处理用户的请求.所以JSP可以看成运行时servlet. 1).将内容的生 ...