Hibernate多层的单向1对多关系的查询

在使用Hibernate时,如果碰到多层的1对多关系,处理不当的话会导致查询时产生大量的sql语句。比如有三个持久化对象,关系如下:

学校(School) --1对多-->  教室(ClassRoom) --1对多--> 座位(RoomSeat)

 

假如一个学校有40间教室,一个教室有30个座位,当要查询出一个完整的School对象,使用Hibernate的自动加载模式,就会产生大量的sql语句。当执行:
from School where School_Id = ?
会产生40条sql查询语句:

1条 select * from School where School_Id  = ?
2条 select * from ClassRoom where School_Id  = ?

3-42条
    select * from RoomSeat where ClassRoom_Id= 1
    select * from RoomSeat where ClassRoom_Id= 2
     ..............
    select * from RoomSeat where ClassRoom_Id= 40

产生怎么多sql查询语句明显性能不对。

 

使用1对多的多层关系,必然回导致查询时出现大量的sql语句.Hibernate的文档建议多对1代替1对多。
网上有人提出,去掉1对多的关系.但是毕竟对象业务上有关系存在,删除了关系那就不伦不类了.
我的解决方法是:首先要将1对多关系修改为多对1关系。 将三个对象关系修改为单向多对1,然后手工去维护 1对多 的关系。修改后关系如下:
座位(RoomSeat) --多对1-->  教室(ClassRoom) --多对1-->  学校(School)

当要查询一个完整的学校对象时,执行:
select RoomSeat.classRoom as room, RoomSeat as seat where room.School_Id = ?

room.getRoowSeats().add(seat)

select ClassRoom.school as school, ClassRoom as room where room.School_Id = ?
school.getClassRoom().add(room)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值