1:低版本的hibernate,多表关联查询,比如一个以航司的订单表order,航段表flight,乘机人表passenger为例,订单表和航段表一对多关系,订单表和乘机人也是一对多关系。
通过id去查询订单表,那么将执行3条sql语句。
select * from order where id='order1';
select * from flight where orderId='order1';
select * from passenger where orderId='order1';
2:其实通过id去查询并不会有什么大问题。但是如果是查询订单list,分页查询,或者整表查询,问题就来了。
假设order表中有3个订单,id分别是order1,order2,order3,那么hibernate将执行7条sql语句
select * from order;
select * from flight where orderId='order1';
select * from passenger where orderId='order1';
select * from flight where orderId='order2';
select * from passenger where orderId='order2';
select * from flight where orderId='order3';
select * from passenger where orderId='order3';
3:上面的问题在低版本(hibernate3.0属于这种低版本)中也有处理方式,就是用懒加载lazy,当然这样是不科学的,因为我们并不希望懒加载,我们就是要级联查询出数据出来。另外低版本也可以自己写sql,但是这样违背了面向对象编程。
4:hibernate高版本修复了这个问题,高版本是这样处理的。
selcet * from order left join flight on order.id=flight.orderId left join passenger on order.id=passenger.orderId;
一条sql语句搞定7条sql语句.
5:这件事告诉我们,要多去看看新版本的软件的功能,说不定就修复了以前做的很烂的功能。