2012-04-01 2 views
0

Если я сохраняю объект с использованием сеанса Hibernate и затем проверяю, чтобы получить этот объект из текущего сеанса в самой следующей строке (т. Е. Без изменений, которые были записаны в DB еще), будет возвращен сеанс объект? Я предполагаю, что это должно, потому что оно также знает, какие изменения были внесены в него.Попытка понять сеансы Hibernate

ответ

0

Да, представление объектов, которые были сохранены, и загружаемых/запросов должно быть последовательным. Иногда запрос вызывает сброс всех выдающихся изменений в базу данных перед выполнением запроса, чтобы обеспечить эту согласованность (при условии, что сеанс установлен в режим автопотока по умолчанию).

Далее, в этом случае сессия должна вернуть тот же самый объект, который вы сохранили, а не копию, относящуюся к той же строке в базе данных.

+0

но он возвращает значение null в тесте JUnit, который простирается от AbstractAnnotationAwareTransactionalTests и помечен как транзакционный – preslavrachev

+0

как вы «исследуете» для объекта? используя запрос? сделал сеанс автофвола перед ним? делает ли вызов session.flush() перед запросом? – araqnid

+0

Я просто сохраняю, flush, а затем попытаюсь схватить его из сеанса на следующей строке ... и он возвращает null, хотя я вижу, что INSERT SQL отправляется в БД. Может быть, тест отмечен как @Transactional? – preslavrachev

0

Это должно быть, но вы должны быть осторожны при реализации равенства и хэш-кода. Сессия - это просто большой хэш-файл с объектами, связанными с идентификатором объекта. Поэтому, если вы попытаетесь получить объект по ID, вы получите тот же объект.

Смежные вопросы