关键字: hibernate
Hibernate3API
接口汇总
Hibernate
的数据库连接和初始配置不管是什么框架,总离不开配置文件…
Hibernate3API中的接口可以分为以下四大类:
l 提供访问数据库的操作的接口:Session,Transaction,Query
l 用于配置Hibernate的接口:Configuration
l 回调接口,使应用程序接受Hibernate内部发生的事件,并做出相关的响应的接口:Interceptor,Lifecycle,Validatable
l 用于扩展Hibernate的功能接口:UserType,CompositeUserType,IdentifierGenerator
Hibernate
对数据库的基本操作依赖的五个核心接口:
l Configuration界面:配置Hibernate,预启动Hibernate,创建SessionFactory对象
l SessionFactory界面:初始化Hibernate,充当数据源代理,创建Session对象
l Session界面:负责保存,更新,删除,加载和查询对象
l Transaction界面:管理事务
l Query和Criteria界面:执行数据库查询
Configuration实例指定对象-关系映像文件的位置或者动态配置Hibernate的属性,然后将创建
SessionFactory实例(事实上对象-关系映像文件的位置可以和Hibernate的配置一样使用一个XML文件来配置指定)
一个SessionFoctory实例对应一个数据源,提供 Session实例
值得说明的是SessionFoctory是一个线程安全的重量级物件.这意味着SessionFoctory是可以被多个线程共享的,同时也是应该永久的存在贯穿整个应用生命周期.
SessionFotory拥有一个存放预定义的SQL语句以及映像元数据的缓存.如果有需要还可以利用第三放媒介为其配置一个缓存插件,也就是二级缓存.
二级缓存用来存放已经取得的数据并且将来还会用到的数据,由于这些数据能被所有的请求访问所以一个请求通常对应一个事务。
Session实例提供了持久化相关的操作,也就是增删改查,是Hibernate中使用最多的接口
Session是轻量级的,同时是线程不安全的.每个请求都有属于自己的Session实例.
每个Session实例都拥有一个存放当前请求加载过的对象的缓存,我们称呼为一级缓存
Transaction接口是Hibrnate的数据库事务接口,封装底层的事务接口:
l JDBC(Java DataBase Connectivity) API---Java 数据库连接
l JTA(Java Transaction API)---Java事务API
l CORBA(Common Object Request Broket Architecture)API---
公用对象请求代理(调度)程序体系结构
Hibernate通过Transaction接口来声明事务有助于在不同的环境或容器中移植
Query和Criteria接口是Hibernate的查询接口,负责控制查询过程向数据库查询对象.
Hibernate本身有套名为HQL(Hibernate Query Language)的查询语言,基本和SQL类似.
但是HQL是面向对象的,它引用类名以及类的属性名,而不是表名和表字段名
虽然Session的find()方法也能执行HQL,但是功能远没有Query强大.
至于Criteria完全封装了基于字符串形式的查询语句比Query更面向对象,适合执行动态查询
Hibernate
关系
-
映像类型接口
Type:
Type接口提供了各种实现类,每个实现类代表各自具体的映射类型.这些实现类皆为静态,意味着我们不必自己创建这些实例
有需要也可以自己实现UserType和CompositeUserType接口定义客户化映像类型
Hibernate
应对不同数据库
SQL
方言的抽象类
Dialect
:
SQL虽然是种通用的查询语言,但是不同的数据库厂商为了某些功能或者根本就是制造噱头在其中添枝加叶,比如标识列的策略.而Hibernate需要根据不同的数据库执行持久策略,以生成SQL语句和标识列策略.
org.hibernate.dialect.Dialect抽象类本身提供了当前主流的数据库方言继承类,假如访问一个Hibernate并未提供相应的内置Dialect继承类时,我们可以根据该数据库的SQL方言自己扩展继承Dialect抽象类
Hibernate
跟踪数据库操作事件
(
回调接口
)
:
Hibernate利用回调接口能对一个对象的特定事件进行响应
l 对象被保存
l 对象被删除
l 对象被更新
l 对象被加载
Hibernate的回调界面根据实现方法分为两类:
l 持久化类必须实现的侵入式接口:响应事件的Lifecycle接口和数据验证的Validatable接口.这种方式会将HibernateAPI侵入到持久类中,不推荐使用
l 不需要持久化类实现的Interceptor接口,该接口由额外的类来实现
Hibernate
功能扩展接口:
Hibernate允许用户根据需求实现接口或扩展特定类来定义客户化的策略
l 定制主键的生成策略:IdentifierGenerator接口
l 定制本地SQL方言:Dialect抽象类
l 定制缓存机制:Cache和CacheProvider接口
l 定制JDBC连接管理:ConnectionProvider接口
l 定制事务管理:TransactionFactory,Transaction和TransactionManagerLookup接口
l 定制ORM策略:ClassPersister接口以及它的子接口
l 定制属性访问策略:PropertyAccessor接口
l 创建代理:ProxyFactory接口
l 定制客户化映射类型:UserType和CompositeUserType接口
除UserType和CompositeUserType接口以外其他的接口Hibernate都至少实现一个实现类,通常情况下我们只需要使用Hibernate内置的实现类,假如需要定制实现类可以参考这些内置实现类的源代码
Hibernate是Java应用和关系数据库之间的桥梁(虽然Oracle号称是面向对象的,但是使用SQL语句操作的时候依然是关系型的)
Hibernate负责Java对象和关系数据库之间的映射,并且封装了通过JDBC访问数据库的操作,向上层应用提供面向对象的数据访问API(虽然Hibernate封装了JDBC,但是那只是轻量级的。这意味着我们也可以绕过Hibenrate的API直接使用JDBC访问数据库)
既然Hibernate需要和数据库打交道,自然离不开访问数据库,我们先来看看Hibernate如何访问数据库:
Hibernate从配置文件中读取和数据库连接有关的信息,这个配置文件位于代码包中的最上层,采取的配置的文件有两种形式:一种是XML格式,一种是Java属性文件
我们先看看Java属性文件的写法,在此之前先明白任何一种框架都有它的命名规则,Hibernate也一样。
所以Java属性文件的名字必须是:hibernate.properties
hibernate.properties中有如下属性:
属性 | 描述 |
hibernate.dialect
|
指定数据库使用的SQL方言,hibernate自带的方言支持对象通常位于org.hibernate.dialect包下
|
hibernate.connection.driver_class
|
指定数据库的驱动程序
|
hibernate.connection.url
|
指定连接数据库的URL
|
hibernate.connection.username
|
指定连接数据库的用户名
|
hibernate.connection.password
|
指定连接数据库的密码
|
hibernate.show_sql
|
指定是否在控制台输出SQL代码,默认为false
|
hibernate.connection.datasource
|
指定容器管理的数据源连接池的JNDI,假如使用该属性通常不再需要设置其他属性。当然SQL方言依然需要指定
|
C3P0连接池属性 | |
hibernate.c3p0.min_size
|