Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Проблема N+1 запроса при работе с Hibernate? / 4 сообщений из 4, страница 1 из 1
01.03.2006, 15:54
    #33574362
Alexey Turn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема N+1 запроса при работе с Hibernate?
При работе с деревом: идет load одной из рубрик, добегает то nod-ы с родителем 0 и кидает Exception, потому что nod-ы с id=0 нет в базе.
Как решается описанная проблема в Hibernate3 ?

Код: plaintext
Rub rub = (Rub) Hibernate3Support.currentSession().load(Rub. class ,  new  Integer( 138 ));

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.
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
     PUBLIC  "-//Hibernate/Hibernate Mapping DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">


<hibernate-mapping 
	 default -lazy="true">

	< class  name="Rub" table="rubs">

		<id name="id" type="integer" unsaved-value="null">
			<column name="id" sql-type="int" not- null ="true" />
			<generator  class ="assigned" />
		</id>
				
		<property name="isPay" type="integer">
			<column name="ispay" not- null ="true" />
		</property>

		<property name="rubName" type="string">
			<column name="rubname" not- null ="false" />
		</property>

		<property name="levelName" type="string">
			<column name="levelname" not- null ="false" />
		</property>

		<property name="sort" type="integer">
			<column name="sort" not- null ="true" />
		</property>
		
		<property name="parentId" type="integer">
			<column name="parent_id" not- null ="true" />
		</property>
		
		
		<many-to-one name="parent"  class ="Rub" column="parent_id" insert="false" update="false" lazy="true" />
				
		<set name="children"
			lazy="true">
			<key column="parent_id" />
			<one-to-many  class ="Rub" />
		</set>
		
	</ class >

</hibernate-mapping>
...
Рейтинг: 0 / 0
01.03.2006, 20:00
    #33575176
BlackWall
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема N+1 запроса при работе с Hibernate?
На первый взгляд, он создает прокси, который потом загружает объект из БД при первом обращении. По идее, проблему можно решить, если убрать default-lazy="true", ассоциация parent и так загружается lazy.
...
Рейтинг: 0 / 0
02.03.2006, 08:16
    #33575580
Alexey Turn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема N+1 запроса при работе с Hibernate?
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.
...
Рейтинг: 0 / 0
02.03.2006, 09:33
    #33575704
Alexey Turn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема N+1 запроса при работе с Hibernate?
<many-to-one name="parent" class="Rub" column="parent_id" insert="false" update="false" lazy="proxy" />

Поставил lazy="proxy" все заработало.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Проблема N+1 запроса при работе с Hibernate? / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]