nHibernate и проверка параллелизма

Я хочу добиться проверки параллелизма с помощью nHibernate 3 с использованием шаблона UnitOfWork.

Чтобы быть более точным:

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

Я использую временную метку для версии объекта.

Вот мой файл сопоставления

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="...."
                   namespace="...."
                   default-lazy="false">    
  <class name="Employee"
         optimistic-lock="version"
               dynamic-update="true">
    <id name="Id">
      <generator class="native" />
    </id>
    <version column="LastEditDate" generated="always" type="timestamp" />
    <property name="Name" not-null="1" length="255" />
    <property name="LastEditUser" not-null="1" length="255"/>
  </class>    
</hibernate-mapping>

Я понятия не имею, как обновить сущность в контексте сеанса.

var entity = <updated by user>
using (var session = GetNewSession())
{
    //todo: load current version value / attach entity to context
    session.SaveOrUpdate(entity);
    //if concurency check fails, StaleObjectException (or similar) is expected to be thrown
}

В SQL это должно работать так

UPDATE ENTITY SET LastEditDate = @P1, ... WHERE ID = @P2 AND LastEditDate = @P3

where:
@P1 - new LastEditDate
@P2 - entity ID
@P3 - previous LastEditDate

Если ROWSMODIFIED = 1, то обновление прошло успешно, иначе, если = 0, то ConcurrencyException

С помощью Linq2Sql это было очень просто: создайте столбец управления версиями, прикрепите сущность к новому контексту сеанса и попробуйте обновить.

Как я могу сделать это в nHiberate? Поддерживается ли он?


person tomo    schedule 26.03.2011    source источник


Ответы (2)


session.Update(entity)

должно быть достаточно.

person Diego Mijelshon    schedule 26.03.2011

Я думаю, вам следует использовать session.Lock(entity,LockMode.Update).

person Felice Pollano    schedule 26.03.2011
comment
Я использую оптимистическую блокировку. Я могу ошибаться, но session.Lock выглядит как пессимистичный сценарий блокировки. - person tomo; 26.03.2011
comment
чтобы сохранить объект в другом сеансе, вам необходимо заблокировать объект для более нового сеанса. - person Felice Pollano; 26.03.2011