发帖    主题    评论    推荐    标签    作者    订阅    查搜    注册   登陆   关注
 
面向对象 设计模式 领域驱动设计 企业架构 框架 开发教程 微服务 大数据 扩展性 并发编程 事件驱动 分布式 SOA

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

2009-04-23 11:53
赞助商链接

如果系统的对象存在多层的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对多关系呢?

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对多的关系建立.

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

赞助商链接

赞助商链接

返回顶部

移动版 关于本站 使用帮助 联系管理员 最佳分辨率1366x768
OpenSource JIVEJDON Powered by JdonFramework Code © 2002-20 jdon.com