1

UnitOfWork パターンを使用して nHibernate 3 を使用して同時実行チェックを実現したいと考えています。

より正確には:

  • 新しいセッション セッションを開く
  • セッションでエンティティをロードし、
  • クローズセッション、
  • 読み込まれたエンティティのデータを編集する時間をユーザーに与えます。
  • 新しいセッションを開き、
  • データの更新
  • セッションを閉じます。

エンティティのバージョンにタイムスタンプを使用しています。

ここに私のマッピングファイルがあります

<?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 でそれを行うにはどうすればよいですか? サポートされていますか?

4

2 に答える 2

1
session.Update(entity)

十分なはずです。

于 2011-03-26T12:51:40.533 に答える
0

を使うべきだと思いますsession.Lock(entity,LockMode.Update)

于 2011-03-26T09:18:24.380 に答える