hibernate总结.docx

上传人:b****4 文档编号:24649912 上传时间:2023-05-29 格式:DOCX 页数:36 大小:26.90KB
下载 相关 举报
hibernate总结.docx_第1页
第1页 / 共36页
hibernate总结.docx_第2页
第2页 / 共36页
hibernate总结.docx_第3页
第3页 / 共36页
hibernate总结.docx_第4页
第4页 / 共36页
hibernate总结.docx_第5页
第5页 / 共36页
点击查看更多>>
下载资源
资源描述

hibernate总结.docx

《hibernate总结.docx》由会员分享,可在线阅读,更多相关《hibernate总结.docx(36页珍藏版)》请在冰豆网上搜索。

hibernate总结.docx

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;i

TFamilytf1=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的数据

***

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 计算机硬件及网络

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1