关于Hibernate多层1对多关系查询

09-04-23 BinnyJ

如果系统的对象存在多层的1对多关系,比如 "试卷"-(1对多)-"试题"-(1对多)-"选项"之间的关系. 假如一份试卷有40试题,每个试题有4个选项. 那么当我象拿出一份试卷的时候,就会产生 42条查询语句.

1条 select * from 试卷 where 试卷.Id = ?

2条 select * from 试题 where 试题.试卷.Id = ?

3-42条:

select * from 选项 where 选项.试题.Id = 1

select * from 选项 where 选项.试题.Id = 2

.

.

select * from 选项 where 选项.试题.Id = 40

很明显,效率低阿... 难道没办法产生 少点查询语句. 还是说 Hibernate 不适合这种多层的1对多关系呢?

BinnyJ
2009-04-23 17:52

自问自答吧....经过查找hibernate的文档和上网查找相关资料,发现如果使用1对多的多层关系,必然回导致查询时出现大量的sql语句.

网上有人提出,去掉1对多的关系.但是毕竟对象业务上有关系存在,删除了关系那就不伦不类了.

我的解决方法是:

将"试卷"-(1对多)-"试题"-(1对多)-"选项" 变为 "选项"-(多对1)-->"试题"-(多对1)-"试卷" 的关系,hibernate推荐尽量使用"多对1"关系, "多对1"的关系再查询和插入数据方面比"1对多"性能好. 将原来的"1对多"变为"多对1"后, 实际业务中还是需要"1对多"的关系, 因此查询出多对1关系后,手工建立会1对多的关系..

select 试题, 试题.试卷 where 试题.试卷.Id = ?

试题.试卷.get试题s().add(试题)

1条sql语句就能完成 1对多的关系建立.

虽然问题解决了,但始终觉得没真正解决问题..... ...