hibernate学习(三) 表与表的关系和HQL总结

一、表与表的关系

用对象模型表示。用set的目的是为了避免数据重复。
在一对多的时候,在一的一方新建一个set泛型为多的一方。在多的一方中新建一个一的一方的对象。
多对多的时候分别建立两个泛型为对方的set。
hibernate学习(三) 表与表的关系和HQL总结

二、一对多的配置方法

一的一方配置如下:
使用set集合来描述Customer. java类中的属性linkMens。在Hibernate的映射文件中,使用标签用来描述被映射类中的Set集合,标签的column属性值对应文件多的一方的外键名称,在Customer. java客户类中,客户与联系人是一对多的关系,Hibernate的映射文件中,使用标签来描述持久化类的一对多关联,其中class属性用来描述映射的关联类。
hibernate学习(三) 表与表的关系和HQL总结

多的一方配置如下:
标签定义两个持久化类的关联,这种关联是数据表间的多对一关联,联系人与客户就是多对一的关系,所以用标签来描述。标签的name属性用来描述customer在LinkMan.java类中的属性的名称,class属性用来指定映射的类,column属性值对应表中的外键列名。
hibernate学习(三) 表与表的关系和HQL总结

使用方法如下
hibernate学习(三) 表与表的关系和HQL总结

级联操作:cascade
简化操作,设置cascade为save-update,此时save(customer类,一的类)可以自动save(linkman类,多的类)同理,删除delete(customer类)会自动也删除delete(linkman类)。一般只用save-update
hibernate学习(三) 表与表的关系和HQL总结

性能优化,维护:inverse
此时,双方都维护外键,插入linkman类数据的时候,已经维护了外键,但customer仍维护,会执行一次冗余的外键更新(冗余如下)。
hibernate学习(三) 表与表的关系和HQL总结
此时配置inverse(英语:反转)属性,配置关系是否维护,默认flase,维护关系,配置true,不维护关系。
提高关系维护的性能,多的一方必须自己维护外键,一的一方可以配置放弃维护关系。
hibernate学习(三) 表与表的关系和HQL总结

三、多对多配置方法

hibernate学习(三) 表与表的关系和HQL总结

hibernate学习(三) 表与表的关系和HQL总结

hibernate学习(三) 表与表的关系和HQL总结

hibernate学习(三) 表与表的关系和HQL总结

四、HQL查询总结

面向对象 不会出现表名等,只可能出现对象名或者属性名。
1、排序
hibernate学习(三) 表与表的关系和HQL总结
2、条件
hibernate学习(三) 表与表的关系和HQL总结
hibernate学习(三) 表与表的关系和HQL总结
hibernate 从0开始标识。
3、分页

count sum avg max min
hibernate学习(三) 表与表的关系和HQL总结

4、聚合参数
hibernate学习(三) 表与表的关系和HQL总结

5、投影查询
hibernate学习(三) 表与表的关系和HQL总结
在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;

hibernate学习(三) 表与表的关系和HQL总结

1、HQL的多表查询
(1)内连接:返回结果为一个customer+一个linkman 组成一个数组,数组再添加到list中
hibernate学习(三) 表与表的关系和HQL总结
(2)迫切内链接:在上面的基础上加一个fetch,返回的不再是object[]数组,返回的是customer,linkman数据存在其的set中。
hibernate学习(三) 表与表的关系和HQL总结

2、QBC语法
分页与hql相同

排序
hibernate学习(三) 表与表的关系和HQL总结
聚合函数:
hibernate学习(三) 表与表的关系和HQL总结
离线的criteria:将条件拼接提到web层
hibernate学习(三) 表与表的关系和HQL总结
hibernate学习(三) 表与表的关系和HQL总结

六、hibernate的延迟加载

get/load的区别 get立即加载。
load会延迟加载。执行时,不发送sql语句,返回一个代理对象,使用该对象的时候才执行查询。
延迟加载:获得不使用不会查询,使用的时候才查询。是否对类进行延迟加载可以通过在class元素上配置lazy属性进行控制。使用动态代理,debug模式中有$符号的对象就是代理对象。
hibernate学习(三) 表与表的关系和HQL总结

关联级别的策略
(1)集合策略—customer
hibernate学习(三) 表与表的关系和HQL总结
fetch属性:单表,只查询本对象;多表,一次性查询及其关联

(2)关联级别查询—-linkman
hibernate学习(三) 表与表的关系和HQL总结

结论:为了提高效率,fetch的选择应选择select lazy的取值应选择true,使用默认值。

no-session问题解决:
扩大session的作用范围。用filter开启session和关闭
批量查询
hibernate学习(三) 表与表的关系和HQL总结