1.1. Configuration
Configuration类负责管理 Hibernate 的配置信息
包括如下内容:1,Hibernate运行的底层信息:数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect,数据库连接池等(对应 hibernate.cfg.xml 文件)。2,持久化类与数据表的映射关系(*.hbm.xml 文件)。
•
创建Configuration 的两种方式
1, 属性文件(hibernate.properties)
Configuration cfg = new Configuration();
2, Xml文件(hibernate.cfg.xml)
a) 加载默认名称的配置文件(hibernate.cfg.xml)
Configuration cfg = new Configuration().configure();
b) 或加载指定名称的配置文件:
Configuration cfg = new Configuration()
.configure(“myhibernate.cfg.xml”);
1.2. SessionFactory
Configuration对象根据当前的配置信息生成 SessionFactory 对象。SessionFactory 对象一旦构造完毕,即被赋予特定的配置信息(SessionFactory 对象中保存了当前的数据库配置信息和所有映射关系以及预定义的SQL语句。同时,SessionFactory还负责维护Hibernate的二级缓存)。 相关代码如下:
Configuration cfg =new Configuration().configure();
SessionFactorysessionFactory = cfg.buildSessionFactory();
1, SessionFactory是线程安全的。
2, SessionFactory是生成Session的工厂:
Session session = sessionFactory.openSession();
3, 构造 SessionFactory 很消耗资源,一般情况下一个应用中只初始化一个 SessionFactory 对象。
1.3. Session
Session是应用程序与数据库之间交互操作的一个单线程对象,是 Hibernate 运作的中心,所有持久化对象必须在 session 的管理下才可以进行持久化操作。此对象的生命周期很短。Session 中有一个缓存,显式执行flush()方法之前,所有的持久层操作的数据都缓存在 session 对象处。(相当于 JDBC 中的 Connection)
l 持久化类与 Session 关联起来后就具有了持久化的能力。
l Session是线程不安全的
l Session 类的一些方法:
取得持久化对象的方法: get() load()
持久化对象都得保存,更新和删除:save(),update(),saveOrUpdate(),delete()
开启事务: beginTransaction().
管理 Session 的方法:isOpen(),flush(), clear(), evict(), close()等
1.4. Transaction
代表一次原子操作,它具有数据库事务的概念。所有持久层都应该在事务管理下进行,即使是只读操作。
l 代表一次原子操作,它具有数据库事务的概念。所有持久层都应该在事务管理下进行,即使是只读操作。
Transaction tx = session.beginTransaction();
l 常用方法:
commit():提交相关联的session实例
rollback():撤销事务操作
wasCommitted():检查事务是否提交
1.5. Query和Criteria接口
都是查询接口,Query实例包装了HQL查询语句,hql是面向对象的,他引用类名及类的属性名,而不是表名和字段名。Criteria接口完全封装了基于字符串形式的查询语句,比Query接口更面向对象,他擅长执行动态查询。
二、叙述Hibernate应用的工作过程
Hibernate的运行过程如下:
1、应用程序先调用Configuration类,该类读取Hibernate配置文件及映射文件中的信息,
2、并用这些信息生成一个SessionFactory对象,
3、然后从SessionFactory对象生成一个Session对象,
4、并用Session对象生成Transaction对象;
A、可通过Session对象的get(),load(),save(),update(),delete()和saveOrUpdate()等方法对PO进行加载、保存、更新、删除、等操作;
B、在查询的情况下,可通过Session对象生成一个Query对象,然后利用Query对象执行查询操作;如果没有异常,Transaction对象将提交这些操作到数据库中。
三、解释Hibernate全局配置文件中常用标记的使用
常用hibernate影射配置说明:
节点内容:
<hibernate-mapping schema="dbo" catalog="shopping" default-cascade="none|all|save-update|delete" default-access="property|field|ClassName" default-lazy="true|false" auto-import="true|false" package="package.name"> |
表1hibernate-mappiing节点参数的说明
参数 | 描述 | 必须 |
schema | 数据库Schema名称 | N |
catalog | 数据库catalog名称 | N |
default-cascade | 默认级联模式默认是none | N |
default-access | 默认属性访问模式 对于大多数情况采用property即可,这种方式将通过getter/setter方法对影射类属性进行存取,默认是property | N |
default-lazy | 数据加载模式。默认是true即延迟加载模式 | N |
auto-import | 在查询语言中是否可以使用不包含包名的类名为,true时表示HQL中只需包含类名;为false时表示HQL必须包含全路径类名 | N |
package | 本影射文件中影射类的 默认包名,如果有这个属性那么在影射文件中我们只需指定类名就可以了 | N |
1、 class节点定义:
节点内容:
<class name="com.wzq.hibernate.model.Users" table="users" discriminator-value="1" mutable="true|false" schema="dbo" catalog="shopping" proxy="ProxyInterface" dynamic-update="false|true" dynamic-insert="false|true" select-before-update="false|true" polymorphism="implicit|explicit" where="arbitrary sql where condition" persister="persisterClass" batch-size="number" optimistic-lock="none|version|dirty|all" lazy="false|true" entity-name="entityName"> |
表2 class节点参数说明
参数 | 描述 | 必须 |
name | 类名 | Y |
table | 类对应的表名 | N |
discriminator-value | 子类辨别标识用于多态支持 | N |
mutable | 类是否会发生改变,如果类实例对应的库表记录不会发生变化,可将其设为false,Hibernate在进行脏数据检查时将忽略此类型数据,从而在一定程度上提升性能。如对应日志表的影射类,通常日志操作是单纯的Insert操作无须update,因此可以设定为false | N |
schema | 数据库schema | N |
catalog | 数据库catalog | N |
proxy | 代理类接口,代理类的作用是为延迟加载提供支持 | N |
dynamic-update | 生成update语句时仅包含发生变动的字段,默认值是false即全部字段 | N |
dynamic-insert | 生成insert语句时仅包含非null的字段,默认值是false即全部字段 | N |
select-before-update | 执行update操作时是否先执行一次select以确定数据发生变化之后才进行更新,默认值是false即不执行select | N |
polymorphism | 多态模式设定 | N |
where | 数据筛选条件如指定where=“location=’shanghai’”之后Hibernate在加载数据时会在生成的sql后自动添加此查询条件 | N |
persister | 指定持久化实现类,通过指定持久化类,我们可以实现自定义的持久化方法。持久化类为ClassPersister接口的实现 | N |
batch-size | 指定每次批量操作的数量 | N |
optimistic-lock | 乐观锁策略 | N |
lazy | 是否使用延迟加载 | N |
entity-name | Hibernate3新增特性,用于动态模型(Dynamic Model)支持 | N |
2、 id节点定义:
节点内容:
<id name="id" type="integer" column="id" unsaved-value="null|none|any|id_value" access="field|property|className"> <generator class="identity" /> </id> |
表3 id节点参数:
参数 | 描述 | 必须 |
name | 影射类中对应主键的属性名 | N |
type | 上述属性的数据类型 |
|
column | 主键字段名 | N |
unsaved-value | 对于对象是否已经保存的判定值 | N |
access | 类属性访问方式 |
|
generator | 用来描述主键的生成方式class指定主键的生成类 |
|
3、 属性/字段映射配置
映射定义:
<property name="emailName" column="emailName" type="string" update="true|false" insert="true|false" formula="arbitrary SQL expression" access="field|property|ClassName" lazy="true|false" not-null="true|false" optimistic-lock="true|false"> |
表4 属性节点参数:
参数 | 描述 | 必须 |
name | 映射类属性名 |
|
column | 对应数据库表字段名 | N |
type | 字段类型 | N |
update | Update操作时是否包含本字段数据 | N |
insert | Insert操作时是否包含本字段数据 | N |
formula | 为映射类配置表达式属性,映射类的属性并非对应库表中某个固定字段,而是由库表中某些字段计算而来,这时可以配置这个属性,对于配置了formula的属性而言,并没有对应的库表字段存在,也无需指定column;示例:<property name=”sumNum” formula=”num1*num2” type=” big_decimal”/> |
|
access | 类属性访问方式 | N |
lazy | 是否采用延迟加载策略 | N |
Unique | 字段是否唯一 | N |
not-null | 字段是否允许为空 | N |
Optimistic-lock |
| N |
4、 一对一节点定义:
节点内容:
<one-to-one name="propertyName" class="ClassName" cascade="none|all|save-update|delete" constrained="false|true" outer-join="auto|true|false" fetch="join|select" property-ref="propertyNameFromAssociatedClass" access="property|field|ClassName"> </one-to-one> |
表5 一对一节点属性:
属性 | 描述 | 必须 |
name | 映射属性名 | Y |
class | 目标映射类 | N |
cascade | 操作级联关系: All:所有情况下均进行级联操作 None:所有情况均不进行级联操作 Save-update:在执行save或update时进行级联操作 Delete:在执行delete时进行级联操作 | N |
constrained | 约束,表明主控表的主键上是否存在一个外键对其进行约束,这个选项关系到save、updae等方法的级联操作顺序 | N |
outer-join | 是否使用外连接在hiebernate3中已经将其废除用fetch替代 | N |
fetch | Jion等同于outer-join=“true” Select等同于outer-join=“false” | N |
property-ref | 关联类中用于与主控类相关联的属性名称,默认为关联类的主键属性名 | N |
access | 属性值的读取方式 | N |
5、 一对多关联与集合映射
Set节点内容
<set name="propertyName" table="tableName" schema="schema_name" lazy="false|true" inverse="true|false" cascade="none|all|save-update|delete|all-delete-orphan" sort="unsorted|natural|comparatorClass" order-by="column_name asc|desc" where="arbitrary sql where condition" outer-join="auto|true" fetch="join|select" batch-size="6" access="property|field|ClassName"> <key column="field_name" /> <one-to-many class="ClassName" /> </set> |
表6 Set节点属性说明:
属性 | 描述 | 必须 |
name | 映射属性 | Y |
table | 目标关联数据库表 | Y |
schema | 数据库的schema名称 | N |
lazy | 是否采用延迟加载 | N |
inverse | 用于标识双向关联中被动方一端 Inverse=false的一方(主控方)负责维护关联关系默认值为false | N |
cascade | 操作级联 all-delete-orphan:当被关联对象失去关联宿主时将其级联删除 | N |
sort | 排序类型: Unsorted:不排序(默认) Natural:自然排序(避免于order-by搭配使用) ComparatorClass:指定某个实现了java.util.comparator接口的类作为排序算法 | N |
order-by | 指定排序字段及其排序方式 | N |
where | 数据筛选条件,如果只需要处理库表中某些特定数据的时候,可通过此选项设定结果集限定条件 | N |
outer-join | 是否使用外连接 True:总是使用 outer-join False:不使用outer-join Auto:如果关联对象没有采用proxy机制,则使用outer-join | N |
fetch | Fetch=“join”等同于outer-join=“true” Fetch=“select”等同于outer-join=“false” | N |
batch-size | 采用延迟加载特性时一次读入的数据数量 | N |
sccess | 属性值的读取方式 | N |
<key column="field_name" />
| 多方关联的字段名称 | Y |
<one-to-many class="ClassName" />
| 多方的类名 | Y |
6、 多对一关联
多对一节点内容:
<many-to-one name="createBy" column="create_by" class="User" not-null="true" cascade="none|all|save-update|delete" update="true|false" insert="true|false" outer-join="auto|true|false" fetch="join|select" property-ref="propertyNameFromAssociatedClass" access="property|field|ClassName"/> |
表7 多对一节点属性说明:
属性 | 描述 | 必须 |
name | 映射属性 |
|
column | 关联字段 |
|
class | 类名 默认为映射属性所属类型 |
|
not-null | 此属性是否为空 |
|
cascade | 操作级联关系: All:所有情况下均进行级联操作 None:所有情况均不进行级联操作 Save-update:在执行save或update时进行级联操作 Delete:在执行delete时进行级联操作 |
|
update | Update操作时是否包含本字段数据 |
|
insert | Insert操作时是否包含本字段数据 |
|
outer-join | 是否使用外连接 True:总是使用 outer-join False:不使用outer-join Auto:如果关联对象没有采用proxy机制,则使用outer-join |
|
fetch | Fetch=“join”等同于outer-join=“true” Fetch=“select”等同于outer-join=“false” |
|
property-ref | 关联类中用于与主控类相关联的属性名称,默认为关联类的主键属性名 |
|
access | 属性值的读取方式 |
|
transient、persistent、detached状态关系图如下:
1、transient状态的特征:
* 在数据库中没有与之匹配的数据
* 没有纳入session的管理
2、persistent状态的特征:
* persistent状态的对象在数据库中有与之匹配的数据
* 纳入了session的管理
* 在清理缓存(脏数据检查)的时候,会和数据库同步
3、detached状态的特征:
* 在数据库中有与之匹配的数据
* 没有纳入session的管理