|
|
|
Автоматический flush() после merge()
|
|||
|---|---|---|---|
|
#18+
Достаточно тривиальный проект SpringMVC/Hibernate. С клиента поступает запрос, контроллер обрабатывает, для работы с объектами/сущностями сделаны слои Service и Repository. Пример попытки записи сущности: Код: java 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. Однако хотя класс сервиса объявлен как @Transactional, flush не происходит. Проверка getFlushMode в ДАО показывает, что он MANUAL. Похоже, используемый OpenSessionInViewInterceptor устанавливает для сессии FlushMode.MANUAL, который и используется. Использование setFlushMode(FlushMode.COMMIT) или даже setFlushMode(FlashMode.ALWAYS) перед merge() (или save, saveOrUpdate) на автозапись не влияет. Решение в лоб - использую session.flush() после merge(), но такое ручное управление при наличии @Transactional явно не нравится. В 3 хибернейте можно было для интерцептора OSIV прописать flushMode или flushModeName, в 4-ом - нет, надо переопределять класс. Однако и это решение не нравится - принудительно устанавливать для всех сессий свое значение. Как правильно поступить, когда необходимо в коде явно сохранить сущность? - Мне необходим идентификатор сохраненного объекта. Кстати, удивило поведение при FlushMode.COMMIT/ALWAYS: при merge() автоматически не скидываются данные в базу, однако это должно делаться при следующем запросе, но этого не происходит. Или решение с ручным flush() нормальное? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2013, 16:18:09 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38390374&tid=2128635]: |
0ms |
get settings: |
15ms |
get forum list: |
27ms |
check forum access: |
9ms |
check topic access: |
9ms |
track hit: |
65ms |
get topic data: |
23ms |
get forum data: |
6ms |
get page messages: |
73ms |
get tp. blocked users: |
3ms |
| others: | 375ms |
| total: | 605ms |

| 0 / 0 |
