powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / org.hibernate.TransientObjectException
25 сообщений из 25, страница 1 из 1
org.hibernate.TransientObjectException
    #34608943
Quessir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не знаю, что произошло. Раньше вроде нормально делал session.save(), а вот сегодня почему то Вытащил вот этот exception. Если я правильно понял, то там че-то неладное с sequence-ами?
...
Рейтинг: 0 / 0
org.hibernate.TransientObjectException
    #34609734
expp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
стектрейс и эксплоит. или вас кусок жабодока интересует?
...
Рейтинг: 0 / 0
org.hibernate.TransientObjectException
    #34610921
Quessir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exppстектрейс и эксплоит. или вас кусок жабодока интересует?

нет-нет

Вот последнее, что слелал Hibernate.
Hibernate: select nextval ('public.container_sequence')

Код: 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.
org.hibernate.TransientObjectException: kz.kbtu.dit.model.Device
	at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java: 216 )
	at org.hibernate.type.EntityType.getIdentifier(EntityType.java: 108 )
	at org.hibernate.type.ManyToOneType.isDirty(ManyToOneType.java: 221 )
	at org.hibernate.type.TypeFactory.findDirty(TypeFactory.java: 476 )
	at org.hibernate.persister.entity.AbstractEntityPersister.findDirty(AbstractEntityPersister.java: 2803 )
	at org.hibernate.event.def.DefaultFlushEntityEventListener.dirtyCheck(DefaultFlushEntityEventListener.java: 467 )
	at org.hibernate.event.def.DefaultFlushEntityEventListener.isUpdateNecessary(DefaultFlushEntityEventListener.java: 190 )
	at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java: 113 )
	at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java: 195 )
	at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java: 76 )
	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java: 26 )
	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java: 985 )
	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java: 333 )
	at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java: 106 )
	at kz.kbtu.dit.domain.ContainerManager.addContainer(ContainerManager.java: 59 )
	at kz.kbtu.dit.MainWindow.manageContainer(MainWindow.java: 340 )
	at kz.kbtu.dit.MainWindow$ 16 .widgetSelected(MainWindow.java: 695 )
	at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java: 90 )
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java: 66 )
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java: 928 )
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java: 3348 )
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java: 2968 )
	at kz.kbtu.dit.MainWindow.open(MainWindow.java: 136 )
	at kz.kbtu.dit.MainWindow.main(MainWindow.java: 118 )

И кусок кода

Код: 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.
	Session session = HibernateUtil.getCurrentSession();

		Transaction transaction = session.beginTransaction();

		 try  {

			Device theDevice =  new  Device();

			Model theModel =  new  Model();

			Container theContainer =  new  Container();

			Personal thePersonal =  new  Personal();

			thePersonal.setId(personalId);

			theDevice.setBarcode(barcode);
			theDevice.setModel(theModel);
			theDevice.setCharged( 0 );
			 Long  generated_id = ( Long ) session.save(theDevice);

			transaction.commit();
			
			Device newDevice =  new  DeviceManager().getDevice(generated_id);

			theContainer.setPersonal(thePersonal);
			theContainer.setDevice(theDevice);
			theContainer.setCabinet(cabinet);

			session.save(theContainer);

			transaction.commit();

		}  catch  (HibernateException ex) {

			 throw  ex;
		}
...
Рейтинг: 0 / 0
org.hibernate.TransientObjectException
    #34610966
expp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
думаю так
Код: plaintext
theContainer.setDevice(theDevice);
should be
Код: plaintext
theContainer.setDevice(newDevice);
(если new DeviceManager().getDevice(generated_id);
делает getSession().get(generated_id))

ну и нужно определиться
Код: plaintext
at kz.kbtu.dit.domain.ContainerManager.addContainer(ContainerManager.java:59)
это где?

и вообще - всё переделать.
...
Рейтинг: 0 / 0
org.hibernate.TransientObjectException
    #34611033
vas0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а мне странно beginTransaction один, а комита два...
...
Рейтинг: 0 / 0
org.hibernate.TransientObjectException
    #34611091
Quessir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exppдумаю так
Код: plaintext
theContainer.setDevice(theDevice);
should be
Код: plaintext
theContainer.setDevice(newDevice);
(если new DeviceManager().getDevice(generated_id);
делает getSession().get(generated_id))

ну и нужно определиться
Код: plaintext
at kz.kbtu.dit.domain.ContainerManager.addContainer(ContainerManager.java:59)
это где?

и вообще - всё переделать.

Да нет. Это нормально. Я просто до этого комментил некоторые места. там вот так:

public void addContainer(String barcode, int devTypeId, Long modelId,
Long personalId, String cabinet) {

Session session = HibernateUtil.getCurrentSession();

Transaction transaction = session.beginTransaction();

try {

Device theDevice = new Device();

Model theModel = new Model();

Container theContainer = new Container();

Personal thePersonal = new Personal();

thePersonal.setId(personalId);

theDevice.setBarcode(barcode);
theDevice.setModel(theModel);
theDevice.setCharged(0);
Long generated_id = (Long) session.save(theDevice);

transaction.commit();

Device newDevice = new DeviceManager().getDevice(generated_id);

theContainer.setPersonal(thePersonal);
theContainer.setDevice(newDevice);
theContainer.setCabinet(cabinet);

session.save(theContainer);

transaction.commit();

} catch (HibernateException ex) {

throw ex;
}

}
...
Рейтинг: 0 / 0
org.hibernate.TransientObjectException
    #34611099
Quessir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин сорри.

Код: 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.
	 public   void  addContainer(String barcode,  int  devTypeId,  Long  modelId,
			 Long  personalId, String cabinet) {

		Session session = HibernateUtil.getCurrentSession();

		Transaction transaction = session.beginTransaction();

		 try  {

			Device theDevice =  new  Device();

			Model theModel =  new  Model();

			Container theContainer =  new  Container();

			Personal thePersonal =  new  Personal();

			thePersonal.setId(personalId);

			theDevice.setBarcode(barcode);
			theDevice.setModel(theModel);
			theDevice.setCharged( 0 );
			 Long  generated_id = ( Long ) session.save(theDevice);

			transaction.commit();
			
			Device newDevice =  new  DeviceManager().getDevice(generated_id);

			theContainer.setPersonal(thePersonal);
			theContainer.setDevice(newDevice);
			theContainer.setCabinet(cabinet);

			session.save(theContainer);

			transaction.commit();

		}  catch  (HibernateException ex) {

			 throw  ex;
		}

	}
...
Рейтинг: 0 / 0
org.hibernate.TransientObjectException
    #34611111
Quessir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vas0а мне странно beginTransaction один, а комита два...

Это я сначала записал один объект. Потом взял id-шник от этого объекта. И затем записал второй объект.

[quot expp]и вообще - всё переделать.[/expp]

А как? Можно несколько советов?
...
Рейтинг: 0 / 0
org.hibernate.TransientObjectException
    #34611149
vas0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а чем отличаются theDevice от newDevice?

у тебя проблемы начались случайно не с того, что ты с generator с "increment/native" на сиквенсы перевел?
...
Рейтинг: 0 / 0
org.hibernate.TransientObjectException
    #34611159
Quessir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vas0а чем отличаются theDevice от newDevice?

у тебя проблемы начались случайно не с того, что ты с generator с "increment/native" на сиквенсы перевел?

:) Почти. Правда я недельку где-то прекрасно добавлял и удалял данные.
...
Рейтинг: 0 / 0
org.hibernate.TransientObjectException
    #34611171
vas0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ты еще на первы вопрос не ответил. нельзя newDevice не доставать а использовать theDevice?

PS: и использовать комитов больше чем транзакций начинаешь как то неправильно
...
Рейтинг: 0 / 0
org.hibernate.TransientObjectException
    #34611222
Quessir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vas0ты еще на первы вопрос не ответил. нельзя newDevice не доставать а использовать theDevice?

PS: и использовать комитов больше чем транзакций начинаешь как то неправильно

Потому что, когда я использовал theDevice, он мне говорил, что такой объект уже есть, и я не могу поверх него писать. Поэтому, я сначала записывал его, а потом заново доставал. А есть варианты?
...
Рейтинг: 0 / 0
org.hibernate.TransientObjectException
    #34611329
Quessir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 vas0

А что насчет сикуенсов? Проблема в них?
...
Рейтинг: 0 / 0
org.hibernate.TransientObjectException
    #34611396
vas0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
эх... советовал я тебе когда то книжку почитать.

ладно пару слов по hibernate скажу, если что то буду 3.14здеть то сильно не пинайте (я hiber у себя на работе не использую).

во первых session, это патерн "Unit of Work" (единица работы у Фаулера), фактически три коллекции объектов:
1. Только что добавленные, для них нужно выпольнить sql insert
2. Обновленные, для них нужно выполнить sql update
3. Удаленные для них нужно выполнить sql delete.

Синхронизация сессии с БД происходит не сразу, поэтому:
session.save != sql insert (insert будет выполнен, но фиг знает когда)

Мне кажется что проблемы у тебя не было когда ты использовал generator native. При таком варианте hibernate выполняет типа (select max(id) from table ) и потом это значение использует и у тебя нормально работает метод:
Код: plaintext
 Long  generated_id = ( Long ) session.save(theDevice);

но на сиквенсах такая штука не отрабатывает нормально.

авторПотому что, когда я использовал theDevice, он мне говорил, что такой объект уже есть, и я не могу поверх него писать. Поэтому, я сначала записывал его, а потом заново доставал. А есть варианты?
У session есть такой отличный метод saveOrUpdate. Если сохранять объекты через этот метод, то если у объекта getId != null, то будет insert иначе update.

PS: как то кажется что неправильно ты hibernate используешь
...
Рейтинг: 0 / 0
org.hibernate.TransientObjectException
    #34611475
Quessir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vas0эх... советовал я тебе когда то книжку почитать.
...
PS: как то кажется что неправильно ты hibernate используешь

эх... знаю. :-( да некогда в подробности углубляться.

Но что же тогда делать? Все согласятся, что использовать sequence по-умолчанию для всех таблиц - это гон.
...
Рейтинг: 0 / 0
org.hibernate.TransientObjectException
    #34611511
vas0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот эти три строчки удали

Код: plaintext
1.
2.
3.
4.
			 Long  generated_id = ( Long ) session.save(theDevice);

			transaction.commit();
			
			Device newDevice =  new  DeviceManager().getDevice(generated_id);
...
Рейтинг: 0 / 0
org.hibernate.TransientObjectException
    #34611550
Quessir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пробовал. То же самое. Так мне не надо сохранять theDevice?
...
Рейтинг: 0 / 0
org.hibernate.TransientObjectException
    #34611585
vas0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я тут попробовал
Код: plaintext
 Long  generated_id = ( Long ) session.save(theDevice);
на сиквенсах этот метод тоже нормально отрабатывает (просто при этом происходит обращение к базе).

авторПробовал. То же самое. Так мне не надо сохранять theDevice?
судя по тому что писал выше у тебя каскадное сохранение в мапинге стоит и когда сохраняешь container автоматом сохраняеться и device. Так что его можно не сохранять.
...
Рейтинг: 0 / 0
org.hibernate.TransientObjectException
    #34611616
vas0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
			Personal thePersonal =  new  Personal();

			thePersonal.setId(personalId);

Зачем ты вот это делаешь? Этот id-к ты как получаешь?
...
Рейтинг: 0 / 0
org.hibernate.TransientObjectException
    #34611630
Quessir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да у меня cascade. Но стоит no action. Это все равно?

он мне в любых вариациях выдает этот эксепшн. Если очистить базы(удалить и создать заново), то это заставит его номально работать?
...
Рейтинг: 0 / 0
org.hibernate.TransientObjectException
    #34611641
Quessir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vas0
Код: plaintext
1.
2.
			Personal thePersonal =  new  Personal();

			thePersonal.setId(personalId);

Зачем ты вот это делаешь? Этот id-к ты как получаешь?

Я его у себя в программе беру. Ну типа, ГУИ. Юзер выбирает их Комбо на кого он хочет записать устройство(новое, которое мне тоже нужно записать в базу). У меня в контайнере personalId как fk стоит. Поэтому хибер требует не int-овский(или Long-овский) personalId, а объект Personal.
...
Рейтинг: 0 / 0
org.hibernate.TransientObjectException
    #34611688
vas0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это объект который уже есть базе? попробуй так:

Код: plaintext
            Personal thePersonal =  (Personal) session.get(Personal. class , personalId);
...
Рейтинг: 0 / 0
org.hibernate.TransientObjectException
    #34611723
Quessir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да. Но проблема не в этом. Как видите, он слетает когда вытаскивает sequence из базы.
...
Рейтинг: 0 / 0
org.hibernate.TransientObjectException
    #34611802
vas0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
похоже у тебя не разруливается каскадное сохранение где - то.

Опять же на будущее. Если у тебя есть id (и ты знаешь что у тебя такой объект есть в базе) а тебе нужен объект, то ползуйся методом session.get. Этот метод в базу не лезет, а создает proxy у которого выставлен только id, при этом объект будет загружет после первого обращения к его полям (вызова какого то getter). Так же у сессии есть метод load, этот метод сразу лезет в базу чтобы проинициализировать объект.
...
Рейтинг: 0 / 0
org.hibernate.TransientObjectException
    #34611815
Quessir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ура!!! Решилась. Посмотрел где-то в мануале про cascade="save-update". До этого ставил его, но видать не в том месте.
Теперь прописал его в контейнере и он заработал.
Код: plaintext
1.
2.
3.
<many-to-one name="device"
	entity-name="kz.kbtu.dit.model.Device" cascade="save-update"
	foreign-key="container_fk" column="deviceid" />

Раньше стояло cascade="none".


2 vas0: Огроооомный респект!!!
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / org.hibernate.TransientObjectException
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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