|
|
|
Hibernate. merge update saveOrUpdate
|
|||
|---|---|---|---|
|
#18+
ivanraНо для merge() обязательно выполняется sql select, при любом FlushMode.Если объект уже есть в сессии, то SELECT'а не будет. ivanraНо но в некоторых случаях у меня это не работало (при работе с коллекциями и транзитивными связями), а при заключительном update() - заработалоЭто все от лукавого. Значит, вы изначально что-то сделали неправильно, потом неправильно вызвали merge + update, одно "неправильно" наложилось на другое "неправильно", и по удачному стечению обстоятельств они уничтожили друг друга. Вероятнее всего, у вас некорректно работали каскады (например, на update стояли правильные каскады, а на merge - нет). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2013, 12:53:30 |
|
||
|
Hibernate. merge update saveOrUpdate
|
|||
|---|---|---|---|
|
#18+
cdtyjvquestionerТо есть к merge стоит относиться так - "хибернейт сохрани в базу именно то, что аргумент у merge - он правильный, если есть другие в сессии инстансы - забей на них" ? ну и что же всё таки он тогда возвращает....и зачем?Нет, не так. Еще раз: до тех пор, пока не был вызван флаш (руками, или автоматически по какой-то причине), ни один метод Хибернейта не гарантирует вам, что что-то будет сохранено в базу . Поймите, сессия - это кэш, в котором хранится информация об изменениях определенных объектов. И этот кэш синхронизируется с базой только по флашу. А пока флаша нет, все изменения храняться исключительно в памяти. Метод update говорит Хиберу: 1) Проверь, есть ли у тебя объект с таким ID в сессии. 2) Если нет, то загрузи этот объект из базы в память, а потом перенеси значения полей из объекта-аргумент в тот объект, который загрузил. 3) Если есть - брось эксепшн. Точка. Никакого сохранения в базу нет. Метод merge говорит Хиберу: 1) Проверь, есть ли у тебя объект с таким ID в сессии. 2) Если нет, то загрузи этот объект из базы в память, а потом перенеси значения полей из объекта-аргумента в тот объект, который загрузил (сесионный объект). 3) Если есть, то просто перенеси состояние из объекта-аргумента в сессионный объект. 4) Верни сессионный объект. Точка. Никакого сохранения в базу нет. Вот один пример использования merge, корректный: Код: java 1. 2. 3. 4. 5. 6. 7. student0 - сессионный объект. Все изменения, которые я в него внес, пока была активна сессия, автоматически сохраняться в базу. То есть, при комите транзакции у него будет имя "Ivan". А вот некорректный пример: Код: java 1. 2. 3. 4. 5. 6. 7. Тут я изменил имя у несессионного объекта. А потому это изменение не сохранится базу. Вы почему-то упорно не хотите читать документацию Хибера. Там это в десятки раз лучше разжевано, чем я вам сейчас объясняю. И уж точно в документации нет ошибок. теперь Вы очень хорошо всё пояснили) спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2013, 13:00:08 |
|
||
|
Hibernate. merge update saveOrUpdate
|
|||
|---|---|---|---|
|
#18+
по теме: заметил странное поведение merge всего строка кода: Код: java 1. до ее выполнения: после ее выполнения: ну и вопросы: 1. Как так получилось? 2. Как сделать так, чтобы сохранилось первоначальное(то, что на 1 картинке) содержимое? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2013, 14:23:26 |
|
||
|
Hibernate. merge update saveOrUpdate
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2013, 14:26:15 |
|
||
|
Hibernate. merge update saveOrUpdate
|
|||
|---|---|---|---|
|
#18+
Ключевое слово - каскады (cascade). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2013, 14:36:55 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38407267&tid=2128541]: |
0ms |
get settings: |
11ms |
get forum list: |
42ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
48ms |
get topic data: |
15ms |
get forum data: |
4ms |
get page messages: |
64ms |
get tp. blocked users: |
3ms |
| others: | 268ms |
| total: | 465ms |

| 0 / 0 |
