<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>
属性 | 描述 |
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(); | 开始生命周期 | 临时状态 |
session.save(obj); | 处于生命周期 | 转化为持久状态 |
Long id=obj.getId(); |
处于生命周期 |
处于持久化状态 |
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 |
映射类型 | 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 第二类丢失更新:这是不可重读中的特例,一个事务覆盖另一事务已提