hibernate总结.docx
《hibernate总结.docx》由会员分享,可在线阅读,更多相关《hibernate总结.docx(36页珍藏版)》请在冰豆网上搜索。
hibernate总结
05-06流水号问题
07-10分页
14one-to-one可是创建表在什么时候创建呢15one-to-many
16one-to-many主控权在one端
17one-to-many主控权在one端迫切左外连接:
只返回左侧第一个对象leftjoinfetch
18one-to-many主控权在many端(推荐)
19openSessionInView
20自身做映射:
tree
21many-to-many两端看集合
22多对多拆分成两个一对多:
配置和标准一对多相同
23继承类映射:
1.一张表描述:
一棵树继承类
24继承类映射:
2.每个类对应一张表:
公共类为一张表、子类分别对应一张表
25继承类映射:
3.每个具体类对应一张表:
公共类为抽象、子类分别对应一张完整表
26主键生成方式
27优化一对多
28单端抓取策略
29单端抓取策略
34复合主键
35解决多表存在公共字段的问题
38分离查询
39过滤器查询
40-43二级缓存
hibernate原理:
1.解析hibernate.cfg.xml读取数据库配置信息
2.通过hibernate.cfg.xml读取对象映射配置文件(获取数据表属性
初始化数组用于存入对象的get方法串)
3.连接数据库
4.构造sql字符串
5.构造传入对象的get方法串存入数组中
6.插入数据(获取sql串,先从数组中得到get方法串通过反射得到
真实的get方法及类型,并调用get方法获得属性值把?
替换掉存入库)
*ORM框架:
objectrelationmapping对象关系映射
*sessionFactory工厂模式,内部使用了构造方法私有化是单例模式,session是对外的公共接口,是静态的可直接调用
*session与jsp内置对象无关
*底层封装了jdbc,拼写sql串
*ORM解决的主要问题就是对象-关系的映射。
域模型和关系模型都分别建立在概念模型的基础上。
域模型是面向对象的,而关系数据模型是面向关系的.
*优点:
封装性好、数据库无关性好、使用简单、移植性强
*缺点:
实体操作所以批量时性能不好、表关系不能复杂
*hibernate操作的是对象,必须区分大小写
通过观察HibernateSessionFactory中,加载配置文件,得到sessionFactory,通过getSession()得到session,通过closeSession()关闭session等。
在该类中已封装好了。
*ORM框架:
objectrelationmapping对象关系映射
*Hibernate既不会渗透到上层域模型中,也不会渗透到下层数据模型中。
软件开发人员可以独立设计域模型,不必强迫遵守任何规范。
数据库设计人员可以独立设计数据模型,不必强迫遵守任何规范。
对象-关系映射不依赖于任何程序代码,如果需要修改对象-关系映射,只需修改XML文件,不需要修改任何程序,提高了软件的灵活性,并且使维护更加方便。
*创建表:
反向生成
-第一种
publicstaticvoidcreateTable(){
SchemaExportse=newSchemaExport(configuration);
se.create(true,true);
}
-第二种:
配置属性文件
update
#hibernate.hbm2ddl.autocreate-drop先删除在创建
#hibernate.hbm2ddl.autocreate创建覆盖原库
#hibernate.hbm2ddl.autoupdate存在就不创建否则创建
#hibernate.hbm2ddl.autovalidate检查是否存在库,不存在就异常
*一个SessionFactory实例对应一个数据存储源,应用从SessionFactory中获得Session实例。
SessionFactory有以下特点:
它是线程安全的,这意味着它的同一个实例可以被应用的多个线程共享。
它是重量级的,这意味着不能随意创建或销毁它的实例。
如果应用只访问一个数据库,只需要创建一个SessionFactory实例,
在应用初始化的时候创建该实例。
如果应用同时访问多个数据库,则需要为每个数据库创建一个单独的SessionFactory实例。
*Session接口是Hibernate应用使用最广泛的接口。
Session也被称为持久化管理器,它提供了和持久化相关的操作,如添加、更新、删除、加载和查询对象。
Session有以下特点:
不是线程安全的,因此在设计软件架构时,应该避免多个线程共享同一个Session实例。
Session实例是轻量级的,所谓轻量级是指它的创建和销毁不需要消耗太多的资源。
这意味着在程序中可以经常创建或销毁Session对象,
例如为每个客户请求分配单独的Session实例,或者为每个工作单元分配单独的Session实例。
*持久化对象的状态:
-临时对象:
刚被new出来,没有经过session管理,随时都有可能丢失。
-持久对象:
由临时对象转化而来,经过session管理,数据库中有对应记录
-游离对象:
由持久对象转化而来,数据库中有对应记录,暂时脱离session管理(更新)
*保存对象:
save和session.persist(p);
*HQL:
HIBERNATEQUERYLANGUAGE查询对象的语言
*QBC:
QueryByCriteria查询对象的语言(更加体现面向对象)
fromentitywherepropertyName=:
param
selecta.username,a.sexfromentityawherepropertyName=:
param投影
*QBE检索方式:
是QBC检索方式的子查询方式
//-----------------------------------------------------------------------------------------------------
*hql:
publicListshow(finalStringsex){
return(List)UtilTemDao.execute(newUtilTem(){
publicObjectcallBack(Sessionsession){
Queryquery=session.createQuery("fromTPersonwheresex=:
uname");
query.setString("uname",sex);
returnquery.list();
}
});
}
//链式:
推荐使用
publicListshowA(finalStringsex){
return(List)UtilTemDao.execute(newUtilTem(){
publicObjectcallBack(Sessionsession){
returnsession.createQuery("fromTPersonwheresex=:
uname")
.setString("uname",sex)
.list();
}
});
}
//-----------------------------------------------------------------------------------------------------
qbc:
/**
*显示
*/
@SuppressWarnings("unchecked")
publicListshowQBC(finalStringsex){
return(List)UtilTemDao.execute(newUtilTem(){
publicObjectcallBack(Sessionsession){
Criteriac=session.createCriteria(TPerson.class);
Criterioncr=Expression.eq("sex",sex);
c.add(cr);
returnc.list();
}
});
}
/**
*显示
*/
@SuppressWarnings("unchecked")
publicListshowQBC1(finalStringsex){
return(List)UtilTemDao.execute(newUtilTem(){
publicObjectcallBack(Sessionsession){
Criteriac=session.createCriteria("com.zmx.domain.TPerson");
Criterioncr=Expression.eq("sex",sex);
c.add(cr);
returnc.list();
}
});
}
/**
*显示
*/
@SuppressWarnings("unchecked")
publicListshowQBC2(finalStringsex){
return(List)UtilTemDao.execute(newUtilTem(){
publicObjectcallBack(Sessionsession){
returnsession.createCriteria(TPerson.class)
.add(Expression.eq("sex",sex))
.list();
}
});
}
--------------------------------------------------------------------------------------------------------
qbe:
它是QBC的子功能,允许创建一个对象模板,然后检索出所有和模板相同的对象,但功能不是很强大,且只支持=和like运算符,前提是要依赖QBC查询
publicListshowQBE(finalStringsex){
return(List)UtilTemDao.execute(newUtilTem(){
publicObjectcallBack(Sessionsession){
TPersonp=newTPerson();
p.setSex(sex);
returnsession.createCriteria(TPerson.class)
.add(Example.create(p))
.list();
}
});
}
/**
*
*排序
*/
@SuppressWarnings("unchecked")
publicListshow(){
return(List)UtilTemDao.execute(newUtilTem(){
publicObjectcallBack(Sessionsession){
returnsession.createCriteria(TPerson.class)
.addOrder(Order.desc("id"))
.list();
}
});
}
/**
*聚合函数
*/
publicdoublegetAvg(){
return(Double)UtilTemDao.execute(newUtilTem(){
publicObjectcallBack(Sessionsession){
returnsession.createCriteria(TPerson.class)
.setProjection(Projections.avg("id"))
.list()
.get(0);
}
});
}
/**
*聚合函数
*/
publicintgetCount(){
return(Integer)UtilTemDao.execute(newUtilTem(){
publicObjectcallBack(Sessionsession){
returnsession.createCriteria(TPerson.class)
//.setProjection(Projections.count("id"))
.setProjection(Projections.rowCount())
.list()
.get(0);
}
});
}
/**
*分组
*注意:
不返回当前的对象,返回object
*/
@SuppressWarnings("unchecked")
publicListgetGroup(){
return(List)UtilTemDao.execute(newUtilTem(){
publicObjectcallBack(Sessionsession){
returnsession.createCriteria(TPerson.class)
.setProjection(Projections.groupProperty("sex"))
.list();
}
});
}
/**
*子查询
*注意:
必须是单列单返回
*/
@SuppressWarnings("unchecked")
publicListgetSubQuery(){
return(List)UtilTemDao.execute(newUtilTem(){
publicObjectcallBack(Sessionsession){
DetachedCriteriadc=DetachedCriteria.forClass(TPerson.class);
dc.setProjection(Projections.max("id"));
returnsession.createCriteria(TPerson.class)
.add(Subqueries.propertyEq("id",dc))
.list();
}
});
}
数据库子查询:
必须是单列单返回
select*fromt_personwhereusername=(selectusernamefromt_personwhereid=20)
对于查询显示有两种方式:
迭代,加强for
返回单个对象
publicTPersonshow(finalintid){
return(TPerson)UtilTemDao.execute(newUtilTem(){
publicObjectcallBack(Sessionsession){
returnsession.createQuery("fromTPersonwhereid=:
id")
.setInteger("id",id)
.setMaxResults
(1)
.uniqueResult();
}
});
}
*加载对象:
必须只能通过oid
*get方法加载:
立刻发出sql语句
-使用后可以及时关闭session对象
-如果对象不存在那么空指针异常nullPointException
-使用场景:
如果就是为了显示或获取属性值
*load方法加载(性能好):
延时加载对象,不发出sql语句,直到获取该对象属性值的时候才发出sql语句,使用了CGLIB做代理
-在获取值之前关闭session对象那么就异常porxy-no-session
-如果对象不存在那么对象没有找到异常objectNotFound(使用了CGLIB做代理)
-如果在描述文件中设置延时为假那么和get相同都是立刻发出sql语句
-使用场景:
删除对象
/**
*get
*/
publicTPersonfindByIdGet(intid){
Sessionsession=HibernateSessionFactory.getSession();
session.beginTransaction();
TPersonp=(TPerson)session.get(TPerson.class,id);
session.beginTransaction().commit();
returnp;
}
/**
*load
*/
publicTPersonfindByIdLoad(intid){
Sessionsession=HibernateSessionFactory.getSession();
session.beginTransaction();
TPersonp=(TPerson)session.load("com.zmx.domain.TPerson",id);
session.beginTransaction().commit();
//session.close();
returnp;
}
*关联映射:
-one-to-one:
一对一
-人和身份证
*描述实体、在描述关联文件
-cascade="all"表示级联
关系描述标签:
从端:
person
-one-to-many:
一对多
-员工和家庭成员
*描述实体、在描述关联文件
*one端:
对象应该描述到一个关联的集合中
inverse="false"表示主控权在one端
***主控权在谁,谁就负责加载对端
*会发出多余的update语句,性能不太好
*many端:
*可以把many端的外键属性直接删除掉包括描述文件中的属性
publicStringsave(){
String[]fname=tf.getUsername().split(",");关注:
因为同名后会自动以逗号拼串
String[]fsex=tf.getSex().split(",");
for(inti=0;iTFamilytf1=newTFamily();
tf1.setUsername(fname[i].trim());
tf1.setSex(fsex[i].trim());
user.getTfs().add(tf1);
}
dao.saveUser(user);
returnSUCCESS;
}
*使用外连接返回object数组,且位置固定
范例:
publicvoidtestA(){
PersonDaodao=newPersonDao();
Iteratorit=dao.show().iterator();
while(it.hasNext()){
Object[]obj=(Object[])it.next();
TUseruser=(TUser)obj[0];
System.out.println(user.getUsername());
}
}
页面:
iteratorvalue="l"var="st">
one:
propertyvalue="%{#st[0].username}"/>
iterator>
one-to-manyinverse="true"主控权在many端(推荐)
*配置对象---配置关系文件
*如果在对象中删除了外键属性那么在配置文件中也要删除
*延时加载对端many的数据
***