一、叙述Hibernate应用的主要接口和类


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的管理

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页