сохранить и перейти в спящий режим, используя тот же сеанс, ту же транзакцию - PullRequest
8 голосов
/ 21 сентября 2011

У меня есть сценарий сервисного уровня транзакционный, где я могу зафиксировать только после совершенной транзакции. я упростил это, как показано ниже.

begin transaction

for(loop){

getHibernateTemplate().save(object);


getHibernateTemplate().get(object_by_key); //cannot get object by object_by_key because "object" is not commit into database until entire for(loop) completed. 

}

end transaction. commit();

Я пытаюсь поставить getHibernateTemplate (). Flush (), после save () и могу увидеть «вставку» в show_sql. но запись не отображается внутри базы данных. Как заставить запись в базу данных после каждого save (), а не ждать фиксации, как указано выше?

Ответы [ 4 ]

5 голосов
/ 21 сентября 2011

getHibernateTemplate (). Flush () - это метод, чтобы заставить hibernate выполнять запись в базу данных (отправлять запросы вставки и обновления). Это делается внутри транзакции, поэтому она невидима для других транзакций (запросов от клиента SQL), пока транзакция не будет зафиксирована.

Если запрос на вставку отображается в журнале, он был отправлен в базу данных. Если вы хотите проверить, правильно ли была вставлена ​​запись, вы можете либо выполнить getHibernateTemplate (). Clear () (который удалит все кэшированные данные), а затем выполнить getHibernateTemplate.get () (который будет запрашивать данные из источника данных). , Или другой подход к тестированию - использовать jdbcTemplate (с той же базой данных) для запроса и проверки.

Если используемый вами клиентский инструмент SQL позволяет вам указать уровень изоляции - запуск сеанса клиентского SQL в изолированном состоянии read_uncommited - позволит вам увидеть изменения, сделанные еще до того, как транзакция будет зафиксирована.

0 голосов
/ 21 сентября 2011

Зачем вам нужен объект по ключу? У вас уже есть объект! Если вам действительно нужен ключ объекта (для его печати?), Вы можете использовать новую транзакцию для каждой операции сохранения, помещая в цикл transaction begin и commit.

0 голосов
/ 21 сентября 2011

Как я знаю, ты не можешь сделать это вообще. Не работает Невозможно получить сохраненный объект в той же транзакции. Я думаю, это потому, что сеанс является кэшем первого уровня, и Hibernate может получить новый объект только тогда, когда совершена другая транзакция, которая создает этот объект.

0 голосов
/ 21 сентября 2011

getHibernateTemplate () каждый раз возвращает один и тот же шаблон?Или, если не шаблон, основанный на общем сеансе.Возможно, было бы лучше сохранить шаблон в локальной переменной и использовать его повторно, чем каждый раз вызывать getHibernateTemplate ().

begin transaction

template = getHibernateTemplate();

for(loop){

template.save(object);


template.get(object_by_key); //cannot get object by object_by_key because "object" is not commit into database until entire for(loop) completed. 

}

end transaction. commit();

Я думаю, что ваша проблема может быть в том, что вы используете другой сеанс для сохраненияи принимать звонки.Если они сделаны в одном сеансе, вы должны увидеть поведение, которое вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...