在使用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)