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


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