powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Проблема N+1 запроса при работе с Hibernate?
4 сообщений из 4, страница 1 из 1
Проблема N+1 запроса при работе с Hibernate?
    #33574362
Alexey Turn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При работе с деревом: идет 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
Проблема N+1 запроса при работе с Hibernate?
    #33575176
BlackWall
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На первый взгляд, он создает прокси, который потом загружает объект из БД при первом обращении. По идее, проблему можно решить, если убрать default-lazy="true", ассоциация parent и так загружается lazy.
...
Рейтинг: 0 / 0
Проблема N+1 запроса при работе с Hibernate?
    #33575580
Alexey Turn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Проблема N+1 запроса при работе с Hibernate?
    #33575704
Alexey Turn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
<many-to-one name="parent" class="Rub" column="parent_id" insert="false" update="false" lazy="proxy" />

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


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