powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate. merge update saveOrUpdate
6 сообщений из 31, страница 2 из 2
Hibernate. merge update saveOrUpdate
    #38398729
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanraНо для merge() обязательно выполняется sql select, при любом FlushMode.Если объект уже есть в сессии, то SELECT'а не будет.

ivanraНо но в некоторых случаях у меня это не работало (при работе с коллекциями и транзитивными связями), а при заключительном update() - заработалоЭто все от лукавого. Значит, вы изначально что-то сделали неправильно, потом неправильно вызвали merge + update, одно "неправильно" наложилось на другое "неправильно", и по удачному стечению обстоятельств они уничтожили друг друга. Вероятнее всего, у вас некорректно работали каскады (например, на update стояли правильные каскады, а на merge - нет).
...
Рейтинг: 0 / 0
Hibernate. merge update saveOrUpdate
    #38398741
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cdtyjvquestionerТо есть к merge стоит относиться так - "хибернейт сохрани в базу именно то, что аргумент у merge - он правильный, если есть другие в сессии инстансы - забей на них" ?
ну и что же всё таки он тогда возвращает....и зачем?Нет, не так. Еще раз: до тех пор, пока не был вызван флаш (руками, или автоматически по какой-то причине), ни один метод Хибернейта не гарантирует вам, что что-то будет сохранено в базу . Поймите, сессия - это кэш, в котором хранится информация об изменениях определенных объектов. И этот кэш синхронизируется с базой только по флашу. А пока флаша нет, все изменения храняться исключительно в памяти.

Метод update говорит Хиберу:
1) Проверь, есть ли у тебя объект с таким ID в сессии.
2) Если нет, то загрузи этот объект из базы в память, а потом перенеси значения полей из объекта-аргумент в тот объект, который загрузил.
3) Если есть - брось эксепшн.
Точка. Никакого сохранения в базу нет.

Метод merge говорит Хиберу:
1) Проверь, есть ли у тебя объект с таким ID в сессии.
2) Если нет, то загрузи этот объект из базы в память, а потом перенеси значения полей из объекта-аргумента в тот объект, который загрузил (сесионный объект).
3) Если есть, то просто перенеси состояние из объекта-аргумента в сессионный объект.
4) Верни сессионный объект.
Точка. Никакого сохранения в базу нет.

Вот один пример использования merge, корректный:
Код: java
1.
2.
3.
4.
5.
6.
7.
session.beginTransaction();
	
Student student0 = session.merge(student);
		
student0.setName("Ivan");

session.getTransaction().commit();

student0 - сессионный объект. Все изменения, которые я в него внес, пока была активна сессия, автоматически сохраняться в базу. То есть, при комите транзакции у него будет имя "Ivan".

А вот некорректный пример:
Код: java
1.
2.
3.
4.
5.
6.
7.
session.beginTransaction();
	
session.merge(student);
		
student.setName("Ivan");

session.getTransaction().commit();

Тут я изменил имя у несессионного объекта. А потому это изменение не сохранится базу.

Вы почему-то упорно не хотите читать документацию Хибера. Там это в десятки раз лучше разжевано, чем я вам сейчас объясняю. И уж точно в документации нет ошибок.

теперь Вы очень хорошо всё пояснили)

спасибо.
...
Рейтинг: 0 / 0
Hibernate. merge update saveOrUpdate
    #38407240
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
по теме: заметил странное поведение merge

всего строка кода:

Код: java
1.
Candidate mergedCandidate = (Candidate) session.merge(candidate);



до ее выполнения:

после ее выполнения:


ну и вопросы:
1. Как так получилось?
2. Как сделать так, чтобы сохранилось первоначальное(то, что на 1 картинке) содержимое?
...
Рейтинг: 0 / 0
Hibernate. merge update saveOrUpdate
    #38407247
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
questioner,

1 картинка:

2 картинка:
...
Рейтинг: 0 / 0
Hibernate. merge update saveOrUpdate
    #38407267
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ключевое слово - каскады (cascade).
...
Рейтинг: 0 / 0
Hibernate. merge update saveOrUpdate
    #38407354
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cdtyjv,

оказалось, что я эту вакансию в базу забыл сохранить.

Но странно, что хибернейт вместо отсутствия этой вакансии вставил какую-то покоцанную
...
Рейтинг: 0 / 0
6 сообщений из 31, страница 2 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate. merge update saveOrUpdate
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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