1、Object Relation Mapping
持久化类与关系表对应,持久化类实例与表中一行记录对应。
2、Hibernate核心接口
访问数据库接口:Session、Transation、Query、Criteria
配置Hibernate接口:Configuration
Configuration --(实例化创建)-->SessionFaction--(实例化)-->Session---->(Qurey/Criteria/Transaction)
3、Hibernate使用步骤
a、创建Hibernate配置文件
b、创建持久化类
c、创建对象关系映射文件
d、通过接口访问DATABASE
4、持久化类
被Hibernate持久化到数据库中,通过Setter和Getter方法,若为boolean型则可用is*方法。Hibernate不要求持久化类必须实现Serializable,但在分布式不同结点间传输持久化类必须实现Serializable接口。
5、Hibernate与EJB
Hibernate为普通JAVA类,而EJB必须实现EJB各个接口,运行于容器之中。
6、链编程风格(初始化)
sessionFactory = new Configuration()
.addClass(AAA.class)
.buildSessionFactory();
7、执行数据库操作
初始化后由sessionFactory.openSession()方法获得session实例,并由session实例执行数据库有关操作,save()、update()、delete()、load()、find()。
8、属性作用范围
在映射文件中元素class中属性scope-field设置全局属性作用域;
在映射文件中元素property中scope-field设置为局部属性作用范围。
9、持久化类访问方法
用户--->应用程序--->Setter()<---Hibernate<---DATABASE
用户<---应用程序<---Getter()--->Hibernate--->DATABASE
10、持久化类中加入程序逻辑
Student类中包含firstName、lastName,STUDENT表中只有NAME字段
getName()
{
return firstName+lastName;
}
setName(String name)
{
firstName = ...;
lastName = ...;
}
Hibernate映射文件中只需要映射name和NAME<property name="name" column="NAME"/>,就可以访问setName()和getName()方法,以映射文件为准。
11、formula属性
property元素中的formula属性用于指定一个SQL表达式,可调用SQL函数货包括子查询。
<property name = "totalPrice" formula = "(select sum(o.price) from ORDERS o where o.CUSTUMER_ID = '1222')"/>
当查询CUSTOMER对象时,执行语句:select ID,NAME,(select SUM(O.PRICE) from ORDERS o where o.CUSTOMER_ID = '1222') from CUSTOMERS;
12、dynamic-insert和dynamic-update
应用中把class中dynamic-insert和dynamic-update值设为true可以提高效率,即插入时仅包含字段取值不为null的字段,更新时仅包含字段值发生变化的属性。
13、Hibernate中package属性
package属性用于指定本映射文件中包含类的包名为全局包,从而不必为每个类指定完整包名。
14、OID
Hibernate中用对象标识符OID来维持java对象和表中记录的对应关系,OID定义为整数类型(short、int、long),通常由Hibernate或通过底层数据库给OID赋值。
15、标识符生成器
Hibernate中内置标识符生成器,均适合代理主键
increment:由Hibernate自增生成
identity:由底层数据库生成
sequence:底层数据库序列生成
hilo:根据high/low等算法生成以特定表字段作high值
native:自动选择identity、dequence、hilo
assgned:自然主键(尽量避免使用)
16、inverse属性
为避免Hibernate在清理缓存时对相关联对象都执行更新操作,将inverse设置为true,将主控权交给many一方,以仅控mamy方状态更新对象。
17、cascade属性
级联属性,当cascade属性设置为delete,在删除一对象时自动删除与其级联的对象,删除后持久化对象变为临时状态。
18、session清理缓存时间点
a、commit()时先清理缓存,再向DATABASE提交事务
b、执行find()和iterate()时,确保对象最新状态(iterate()在Hibernate 3#已取消)
c、显式调用flush()方法时
19、持久化对象三状态
a、临时状态,刚new,不处于session缓存中
b、持久化状态,已持久化并加入session中
c、游离状态,被持久化,但不在session中
20、load()和get()
两者都可以由OID加载一个持久化对象,当DB中不存在与OID对应记录时,load()方法会抛出异常,而get()会返回Null值。
21、session激发触发器
如果一个session激发一个触发器,由于触发器对session是透明的,一次造成数据不一致。
解决方法:调用session的flush()方法和refresh()使其同步;
由于使用触发器使得在update时候无法比较属性是否发生变化。
解决方法:在class元素中设置select-before-update为true。
22、精粒度对象模型
从一类中抽象出来的单独类,提高代码重用性,被抽象出来的类在映射文件中定义为<component>,无OID,必须依赖父类。
23、session三种检索类型
a、load()跟get()都以OID加载
Customer customer = (Customer)session.load(Customer.class,new Long(1));//同get()方法
b、find()方法通过HQL进行检索(Hibernate 3# 取消该方法)
List customeLists = session.find("from Customer as c where c.id = 1);
24、延迟检索策略(Hibernate 3# 默认为true)
class种lazy为true时设置延迟检索,load方法仅返回代理类实例,在第一次使用才加载该实例所有数据,只对load方法有效。
25、HQL检索方式
List result = session.createQuery("HQL language")
.setString("customerName","improviser")
.setInteger("customerAge",23)
.list();
26、QBC检索方式
QBC由Criteria和Criterion接口、Expression类组成,支持运行时生成查询语句。Expression提供查询静态方法,返回Criterion对象,Criteria的add方法加入Criterion对象,并以list()执行查询,返回查询结果。
27、QBE检索方式
先创建一个对象模板,再检索所与该模板相同对象,Example创建一个Criterion对象,把Example对象中不为null的属性作为查询条件,QBE只支持"="和"like"比较。
28、分页查询
query.setFirstResult(0);//从第一页开始检索
query.setMaxResults(10);//最多检出10条记录
29、字符配匹模式
字符串通配符为"%"和"_",中文字应为"%%"配匹;在QBC中可以用MatchMode的静态常量实例来设定字符串模式,如Expression.like("name","i",MatchModle.START))。
30、事务一般用法
2 {
3 tx = session.beginTransaction();
4
5 tx.commit();
6 } catch (Exception e)
7 {
8 if (tx != null )
9 try {
10 tx.rollback();
11 } catch (HibernateException ex{}
12 } finally
13 {
14 try {
15 session.close();
16 } catch (){}
17 }