hibernate学习(三) 表与表的关系和HQL总结
一、表与表的关系
用对象模型表示。用set的目的是为了避免数据重复。
在一对多的时候,在一的一方新建一个set泛型为多的一方。在多的一方中新建一个一的一方的对象。
多对多的时候分别建立两个泛型为对方的set。
二、一对多的配置方法
一的一方配置如下:
使用set集合来描述Customer. java类中的属性linkMens。在Hibernate的映射文件中,使用标签用来描述被映射类中的Set集合,标签的column属性值对应文件多的一方的外键名称,在Customer. java客户类中,客户与联系人是一对多的关系,Hibernate的映射文件中,使用标签来描述持久化类的一对多关联,其中class属性用来描述映射的关联类。
多的一方配置如下:
标签定义两个持久化类的关联,这种关联是数据表间的多对一关联,联系人与客户就是多对一的关系,所以用标签来描述。标签的name属性用来描述customer在LinkMan.java类中的属性的名称,class属性用来指定映射的类,column属性值对应表中的外键列名。
使用方法如下
级联操作:cascade
简化操作,设置cascade为save-update,此时save(customer类,一的类)可以自动save(linkman类,多的类)同理,删除delete(customer类)会自动也删除delete(linkman类)。一般只用save-update
性能优化,维护:inverse
此时,双方都维护外键,插入linkman类数据的时候,已经维护了外键,但customer仍维护,会执行一次冗余的外键更新(冗余如下)。
此时配置inverse(英语:反转)属性,配置关系是否维护,默认flase,维护关系,配置true,不维护关系。
提高关系维护的性能,多的一方必须自己维护外键,一的一方可以配置放弃维护关系。
三、多对多配置方法
四、HQL查询总结
面向对象 不会出现表名等,只可能出现对象名或者属性名。
1、排序
2、条件
hibernate 从0开始标识。
3、分页
count sum avg max min
4、聚合参数
5、投影查询
在customer中创建此构造函数和无参构造,创建一个对象来存数据
五、多表查询
交叉连接(笛卡儿积、避免)
select * from A,B
内链接—
隐式内连接 select * from A,B where b.aid = a.id;
显式内连接 select * from A inner join B on b.aid = a.id
外连接—
左外: select * from A left join B on b.aid = a.id;
右外: select * from A right join B on b.aid = a.id;
1、HQL的多表查询
(1)内连接:返回结果为一个customer+一个linkman 组成一个数组,数组再添加到list中
(2)迫切内链接:在上面的基础上加一个fetch,返回的不再是object[]数组,返回的是customer,linkman数据存在其的set中。
2、QBC语法
分页与hql相同
排序
聚合函数:
离线的criteria:将条件拼接提到web层
六、hibernate的延迟加载
get/load的区别 get立即加载。
load会延迟加载。执行时,不发送sql语句,返回一个代理对象,使用该对象的时候才执行查询。
延迟加载:获得不使用不会查询,使用的时候才查询。是否对类进行延迟加载可以通过在class元素上配置lazy属性进行控制。使用动态代理,debug模式中有$符号的对象就是代理对象。
关联级别的策略
(1)集合策略—customer
fetch属性:单表,只查询本对象;多表,一次性查询及其关联
(2)关联级别查询—-linkman
结论:为了提高效率,fetch的选择应选择select lazy的取值应选择true,使用默认值。
no-session问题解决:
扩大session的作用范围。用filter开启session和关闭
批量查询