|
|
|
Проблема N+1 запроса при работе с Hibernate?
|
|||
|---|---|---|---|
|
#18+
При работе с деревом: идет load одной из рубрик, добегает то nod-ы с родителем 0 и кидает Exception, потому что nod-ы с id=0 нет в базе. Как решается описанная проблема в Hibernate3 ? Код: plaintext org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [Rub#0] at org.hibernate.ObjectNotFoundException.throwIfNull(ObjectNotFoundException.java:27) at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:118) at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:167) at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:79) at org.hibernate.impl.SessionImpl.internalLoad(SessionImpl.java:655) at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:261) at org.hibernate.type.EntityType.resolve(EntityType.java:286) at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:105) at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:530) at org.hibernate.loader.Loader.doQuery(Loader.java:436) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:218) at org.hibernate.loader.Loader.loadEntity(Loader.java:1345) at org.hibernate.loader.entity.EntityLoader.load(EntityLoader.java:116) at org.hibernate.loader.entity.EntityLoader.load(EntityLoader.java:101) at org.hibernate.persister.entity.BasicEntityPersister.load(BasicEntityPersister.java:2471) at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:351) at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:332) at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:113) at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:167) at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:79) at org.hibernate.impl.SessionImpl.internalLoad(SessionImpl.java:655) at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:261) at org.hibernate.type.EntityType.resolve(EntityType.java:286) at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:105) at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:530) at org.hibernate.loader.Loader.doQuery(Loader.java:436) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:218) at org.hibernate.loader.Loader.doList(Loader.java:1593) at org.hibernate.loader.Loader.list(Loader.java:1577) at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:395) at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:271) at org.hibernate.impl.SessionImpl.list(SessionImpl.java:844) at org.hibernate.impl.QueryImpl.list(QueryImpl.java:74) at ru.nnews.kernel.pojo.rub.RubTest.testLevel(RubTest.java:31) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at junit.framework.TestCase.runTest(TestCase.java:154) at junit.framework.TestCase.runBare(TestCase.java:127) at junit.framework.TestResult$1.protect(TestResult.java:106) at junit.framework.TestResult.runProtected(TestResult.java:124) at junit.framework.TestResult.run(TestResult.java:109) at junit.framework.TestCase.run(TestCase.java:118) at junit.framework.TestSuite.runTest(TestSuite.java:208) at junit.framework.TestSuite.run(TestSuite.java:203) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:436) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:311) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2006, 15:54 |
|
||
|
Проблема N+1 запроса при работе с Hibernate?
|
|||
|---|---|---|---|
|
#18+
На первый взгляд, он создает прокси, который потом загружает объект из БД при первом обращении. По идее, проблему можно решить, если убрать default-lazy="true", ассоциация parent и так загружается lazy. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2006, 20:00 |
|
||
|
Проблема N+1 запроса при работе с Hibernate?
|
|||
|---|---|---|---|
|
#18+
BlackWallНа первый взгляд, он создает прокси, который потом загружает объект из БД при первом обращении. По идее, проблему можно решить, если убрать default-lazy="true", ассоциация parent и так загружается lazy. Не помогает... Все один и тот же stacktrace Во всем виновата эта строчка. <many-to-one name="parent" class="Rub" column="parent_id" insert="false" update="false" lazy="true" /> Подгружает parent-а, тот подгружает свлоего parent-а итд вверх. Всего выходит 4 запроса: Hibernate: select rub0_.id as id0_, rub0_.ispay as ispay1_0_, rub0_.rubname as rubname1_0_, rub0_.levelname as levelname1_0_, rub0_.sort as sort1_0_, rub0_.parent_id as parent6_1_0_, rub0_.pub_id as pub7_1_0_ from rubs rub0_ where rub0_.id=? Hibernate: select rub0_.id as id0_, rub0_.ispay as ispay1_0_, rub0_.rubname as rubname1_0_, rub0_.levelname as levelname1_0_, rub0_.sort as sort1_0_, rub0_.parent_id as parent6_1_0_, rub0_.pub_id as pub7_1_0_ from rubs rub0_ where rub0_.id=? Hibernate: select rub0_.id as id0_, rub0_.ispay as ispay1_0_, rub0_.rubname as rubname1_0_, rub0_.levelname as levelname1_0_, rub0_.sort as sort1_0_, rub0_.parent_id as parent6_1_0_, rub0_.pub_id as pub7_1_0_ from rubs rub0_ where rub0_.id=? Hibernate: select rub0_.id as id0_, rub0_.ispay as ispay1_0_, rub0_.rubname as rubname1_0_, rub0_.levelname as levelname1_0_, rub0_.sort as sort1_0_, rub0_.parent_id as parent6_1_0_, rub0_.pub_id as pub7_1_0_ from rubs rub0_ where rub0_.id=? И последний запрос является лишним, потому что рубрики с id=0 не существует. А если бы и существовала, то у нее опять же должен быть существующий parent. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2006, 08:16 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=33575176&tid=2150040]: |
0ms |
get settings: |
5ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
282ms |
get topic data: |
15ms |
get forum data: |
4ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
| others: | 203ms |
| total: | 597ms |

| 0 / 0 |
