您的位置:首页 > 其它

关于Hibernate的配置文件参数详解

2015-07-24 20:04 429 查看
1,Hibernate映射文件的配置

<hibernate-mapping>

<class name="项目路径" table="库中对应表名" schema="dbo" catalog="netoa">

<meta attribute="class-description">指定描述类的javaDoc</meta>

<meta attribute="class-scope">指名类的修饰类型</meta>

<meta attribute="extends">指定继承类</meta>

<id name="bgrkbh" type="long">

<column name="BGRKBH" precision="15" scale="0" sql-type="库中类型" check="BGRKBH>10"/>

<meta attribute="scope-set">指定类,类属性的getxxx(),setxxx()方法的修饰符包括:static,final,abstract,public,protected,private</meta>

<generator class="assigned" />

</id>

<property name="Class.fileName" type="long">

<column name="YSLX" precision="精度" scale="刻度" not-null="默认false" sql-type="数据库中类型"/>

附加属性不会影响Hibernate的运行行为

<meta attribute="field-description">指定描述类的javaDoc</meta>

指定描述类属性的javaDoc

</property>

</class>

</hibernate-mapping>

2,<meta>元素的属性

属性

描述

class-description

指定描述类的javaDoc

field-description

指定描述类的属性javaDoc

interface

如果为true,表明生成接口而非类,默认false

implements

指定类所实现的接口

extends

指定继承的父类名

generated-class

重新指定生成的类名

scope-class

指定类的修饰符,默认public

scope-set

指定set方法的修饰符,默认public

scope-get

指定get方法的修饰符,默认public

scope-field

指定类的属性的修饰符,默认private

use-in-toString

如果为true,表示在toString()方法中包含此属性

gen-property

如果为false,不会在java类中生成此属性,默认true

finder-method

指定find方法名

3,<column>元素属性

name

设定字段名字

length

设定字段长度

not-null

如为true,指名该字段不允许为null,默认false

unique

如为true,指名该字段具有唯一约束,默认false

index

给一个或多个字段建立索引

unique-key

为多个字段设定唯一约束

foreign-key

为外键约束命名

<many-to-many>

<one-to-one>

<many-to-one>

foreign-key属性,

设定字段sql类型

设定sql检查约束

inverse

属性为true的一端不能设置foreign-key

4,用于控制insert or update 语句的映射属性

元素

属性名

属性描述

<property>

insert属性

如为false,在insert中不包含该字段,默认为true

update属性

如为false,在update中不包含该字段,默认为true

dunameic-insert属性

如为true,表明动态生成insert语句,只有不为null,才会包含insert语句中,默认false

dunameic-update属性

如为true,表明动态生成update语句,只有不为null,才会包含insert语句中,默认false

<class>

mutable属性

如为false,等价于所有字段的update属性为false,默认为true

dunameic-insert属性

如为true,表明等价于所有字段动态生成insert语句,只有不为null,才会包含insert语句中,默认false

dunameic-update属性

如为true,表明等价于所有字段动态生成update语句,只有不为null,才会包含insert语句中,默认false

5 cascade属性(级联删除)

cascade属性值

描述

none

在保存更新时,忽略其他关联对象,他是cascade默认属性

save-update

当通过Session的save(),update()以及saveOrUpdate()方法来保存或更新当前对象时,及联保存所有关联的新建的临时对象,并且及联更新所有关联的游离对象

delete

当通过session的delete()方法删除当前对象时,及联删除所有对象

all

包含save-update及delete行为,此外对当前对象执行evict()或lock()操作时,也会对所有关联的持久化对象执行evict()或lock()操作

delete-orphan

删除所有和当前对象解除关联关系的对象

all-delete-orphan

包含all和delete-orphan

6,Hibernate提供的内置标识符生成器

内置标识符生成器

方法描述

increment

适用于代理主键,自动递增,增1(只能是long,int,short)

identity

适用于代理主键,底层数据库自动增长字段类型(数据库需支持,只能是long,int,short)

Sequence

(oralce)

适用于代理主键,根据底层数据库的序列来生成标识符(数据库支持序列,只能是long,int,short)

hilo

适用于代理主键,根据high/low算法来生成.Hibernate把特定表的字段作为high值,在默认情况

下选用hibernate_unique_key表的next_hi字段

native

(mysql,mssql)

适用于代理主键,根据数据库自动生成标识符支持能力,来选择identity,sequence,hilo

uuid.hex

适用于代理主键,采用128位UUID(universal unique identification)算法来生成标识.此算法能在网络环境中生成唯一的字符串标识符,(不建议使用,字符串类型比整形类型的主键占用更多的空间)

assigned

适用于自然主键,由java程序负责生成.

7Hibernate应用中java对象的状态

临时状态 (transient):刚刚用new语句创建,还没被持久化,不处与Session的缓存中,处于临时状态的java对象被称为临时对象.

持久化状态(persistent):已经被持久化,加入session的缓存中.处于持久化状态的java对象被称为持久化对象.

游离状态(detached):已经被持久化,但不在处于session的缓存中.处于游离状态的java对象被称为游离对象.

(注意:::::)持久化类与持久化对象是不同的概念.持久化类的实例可以处于临时状态,持久化状态和游离状态.其中处于持久化状态的实例 被称为持久化状态.

7-1临时对象的特性:

1 不处于缓存中,也可以说,不被任何一个Session实例关联

2 在数据中没有对应的纪录.

7-2在此情况下,java对象进入临时状态

1 当通过new创建一个对象时,此时不和数据库中的任何纪录的

对象的状态转化过程

程序代码

对象的生命周期

对象的状态

tx=session.beginTransaction();

Object obj=new Object("tow",new HashSet());

开始生命周期

临时状态

session.save(obj);

处于生命周期

转化为持久状态

Long id=obj.getId();

obj=null;

Object obj2=(Object)session.load(Object.class,id);

处于生命周期

处于持久化状态

tx.commit();

session.close();

处于生命周期

转变成游离状态

System.out.print(obj2.getName());

处于生命周期

处于游离状态

obj2=null;

结束生命周期

结束生命周期

8 HQL和QBC支持的各种运算

运算比较

HQL运算符

QBC运算方法

含义

=

Expression.eq()

等于

<>

Expression.not(Expression.eq())

不等于

>

Expression.gt()

大于

>=

Expression.ge()

大于等于

比较运算

<

Expression.lt()

小于

<=

Expression.le()

小于等于

is null

Expression.isNull()

等于空值

is not null

Expression.isNotNull()

非空值范围运算

in(列表)

Expression.in()

等于列表中的某一值

not in(列表)

Expression.not(Expression.in())

不等于列表中的任意一值

between 值1 and 值2

Expression.between()

大于等于1并小于等于2

not between 值1 and 值2

Expression.not(Expression.between)

小于值1或者大于值2

字符串模式匹配

like

Expression.like()

字符串模式匹配

逻辑运算

and

Expression.and()

Expression.conjunction()

逻辑与

or

Expression.or()

Expression.disjunction()

逻辑或

not

Expression.not()

逻辑非

引申:Expression.eq("name","tom").ignoreCase();不区分大小写

9 集合过滤createFilter()

Session的createFilter()方法用来过滤集合,它具有以下特点.

a 它返回Query类型的实例

b 它所处的对象必须处于持久化状态

c 它的第二个参数指定过滤条件,它由合法的HQL语句组成

d 不管持久化对象的集合是否已经被初始化,Query的list方法都会执行SQL查询语句,到数据库中检索关联对象

e 如对象中的集合已被初始化,为保证Session中缓存不出现id相同的集合对象,Query的list不会在创建集合对象,仅仅返回已经存在的集合对象的引用

f 如对象中的集合对象未被初始化,Query的list()方法会创建相应的(集合名)对象,但不是初始化对象的对象集合

10 子查询的应用

10-1,all 表示子查询语句返回的所有纪录

ex:返回所有订单价格都小于100的客户

from Customer c where 100>all(select o.price from c.orders o)

10-2 any 表示子查询语句返回的任意一条纪录

ex:返回一条订单价格小于100的客户

from Customer c where 100>any(select o.price from c.orders o)

10-3 some 与any等价 ,in 与=any等价

ex:返回一条订单价格等于100的客户

from Customer c where 100=any(select o.price from c.orders o)

from Customer c where 100=some(select o.price from c.orders o)

from Customer c where 100 in (select o.price from c.orders o)

10-4 exists 表示自查询语句至少返回一条纪录

ex:返回至少有一条的订单客户

from Customer c where exists (select c.orders)

如果子查询语句是一个集合,可采用

from Customer c where :order in elements(c.orders)====(from c.orders)

11 xpression.MatchMode类包含的各个静态常量实例

匹配模式

举例

MatchMode.START

Expression.like("NAME","T",MatchMode.StART)姓名以T开头

MatchMode.END

Expression.like("NAME","T",MatchMode.END)姓名以T结尾

MatchMode.ANYWHERE

Expression.like("NAME","T",MatchMode.ANYWHERE)姓名包含T

MatchMode.EXACT

Expression.like("NAME","Tom",MatchMode.SEXACT)姓名必须是Tom

举例:

Iterator it=session.createQuery("select c.name,count(c) from object").list.iterator();

while(it.hasNext()){

Object[] pair=(Object[])it.next();

String name=(String)pair[0];

Integer count=(Integer)pair[1];

}

12 Hibernate映射类型,对应的java基本类型及对应的标准SQL类型

Hibernate 映射类型

java类型

标准SQL类型

integer或者int

int

INTEGER

long

long

BIGINT

short

short

SMALLINT

byte

byte

TINYINT

float

float

FLOAT

double

double

DOUBLE

big_decimal

java.math.BigDecimal

NUMERIC

character

char and string

CHAR

string

string

VARCHAR

boolean

boolean

BIT

13,Hibernate映射类型,对应的java时间和日期类型及对应的标准SQL类型

映射类型

java类型

标准SQL类型

描述

date

java.util.Date或者java.sql.Date

DATE

代表日期,YYYY-MM-DD

time

java.util.Date或者java.sql.Date

TIME

代表时间,形式为HH:MM:SS

timestamp

java.util.Date或者java.sql.Timestamp

TIMESTAMP

代表日期和时间,YYYYMMDDHHMMSS

calendar

java.util.Calendar

TIMESTAMP

同上

calendar_date

java.util.Calendar

DATE

代表日期,YYYY-MM-DD

14 JAVA大对象类型的Hibernate映射类型

映射类型

java类型

标准SQL类型

MYSQL类型

ORALCE类型

binary

byte[]

VARBINARY(或BLOB)

BLOB

BLOB

text

string

CLOB

TEXT

CLOB

serializable

实现Serializable接口任意一个java类

VARBINARY(或BLOB)

BLOB

BLOB

clob

java.sql.Clob

CLOB

TEXT

CLOB

blob

java.sql.Blob

BLOB

BLOB

BLOB

例:

(1) Session session=sessionFactory.openSession();

Transaction tx=session.beginTransaction();

Object obj=new Object();

obj.setFile(Hibernate.createClob(" "));

session.save(obj);

session.flush();

//锁定这条纪录

session.refresh(obj,LocakMode.UPGRADE);

oracle.sql.CLOB clob=(oracle.sql.CLOB)obj.getFile();

//把长文本数据放入Clob中

Writer pw=clob.getCharacterOutputStream();

pw.write(longText);//longText标识长度超过255的字符串

pw.close();

tx.commit();

session.close();

(2) InputStream in=this.getClass().getResourceAsStream("photo.gif");

byte[] buffer=new byte[in.available()];

in.read(buffer);

set

15 映射文件中用于设定检索策略的几个属性

属性

可选值

默认值

描述

lazy

true,false

false

如为true,表延迟索引,<class><set>中包含此属性

outer-join

auto,true,false

在<many-to-one>如为true,表迫切左外连接检索策略,在<many-to-one><one-to-one><one-to-one>和<set>元素中包含此属性元素为auto,在<set>元素中为false

batch-size

正整数

1

设定批量检索的数量,合理取值在3-10间.仅适用于关联级别的立即检索和延迟检索,在<class><set>元素中包含此属性

caonstrained

true

<one-to-one>中的元素,与<many-to-one>的not null在语义上有些相似,它表明对象之间必须关联.

16 HQL操纵集合的函数或属性

size()函数或size属性:获得集合元素的数目

minIndex()函数或minIndex属性:对于建立了索引的集合,获得最小索引

maxIndex()函数或maxIndex属性:对于建立了索引的集合,获得最大索引

minElement()函数或minElement属性:对于包含基本类型元素的集合,获得集合中取值最小的元素

maxElement()函数或maxElement属性:对于包含基本类型元素的集合,获得集合中取值最大的元素

elements()函数:获得集合中的所有元素

ex:from Customer c where c.orders.size>0 or from Customer c where size(c.orders)>0

17 在映射文件中配置SQL语句

<sql-query name="findCustomerAndOrders"><![CDATA[

select {c.*},{o.*} from CUSTOMERS c inner join ORDERS o where C.ID=o.CUSTOMER_ID]]>

<return alias="c" class="Customer"/>

<return alias="o" class="Order"/>

</sql>

比较HQL与QBC的优缺点

比较方面

HQL检索方式

QBC检索方式

可读性

优点:和SQL查询语句较接近,易读

肢解成Criterion实例,可读性差

功能

优点:功能最强大,支持各类查询

不支持报表查询,子查询,连接查询也受限

查询语句形式

缺点:应用程序必须提供基于字符串的HQL语句

优点:提供了更加面向对象的接口

何时被解析

缺点:HQL只有在运行时才被解析

优点:更易排错

可扩展性

缺点:不具有扩展性

优点:允许用户扩展Criterion接口

对动态查询语句的支持

缺点:支持动态语句但编成麻烦

优点:适合生成动态查询

18 Hibernate中的事务

session.disconnect(); 释放数据库连接

session.reconnect(); 重新获得数据库连接

对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各类问题并发.可归纳为以下几类

a 第一类丢失更新:撤销一个事务时,把其他事务已提交的更新覆盖.

b 脏读:一个事务读到另一事务未提交的更新数据

c 虚读:一个事务读到另一事务已提交的新插入的数据

d 不可重复读:一个事务读到另一事务以提交的更新数据

e 第二类丢失更新:这是不可重读中的特例,一个事务覆盖另一事务已提
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: