powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Автоматический flush() после merge()
2 сообщений из 2, страница 1 из 1
Автоматический flush() после merge()
    #38390374
jduser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Достаточно тривиальный проект 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.
@Controller
class ControllerA {
    @Autowired private BaseService baseService;

    @RequestMapping(...)
    public method() {
        ...
        Address address = ...;
        ...
        address = (Address) baseService.put(address);
        ... //действия с новым address
    }
}

@Service
@Transactional
class ServiceA {
    @Resource private BaseDAO baseDAO;

    public Object put(Object object) {
        ...
        return baseDAO.put(object);
    }
}

@Repository
class RepositoryA {
    @Autowired private SessionFactory factory;

    public Object put(Object object) {
        factory.getCurrentSession().merge(object);
    }
}


Однако хотя класс сервиса объявлен как @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() нормальное?
...
Рейтинг: 0 / 0
Автоматический flush() после merge()
    #38391812
jduser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И все-таки? Хочу разобраться, помогите это сделать.
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Автоматический flush() после merge()
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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