現在のユーザーのユーザー名を Envers のリビジョン エンティティ テーブルに記録する方法を調べました。しかし、情報はほとんどなく、私が見つけた情報はそれほど役に立ちませんでした.
次のようなリビジョン エンティティとリスナーがあります。
[RevisionEntity(typeof(EnversRevisionListener))]
public class EnversRevisionEntity : DefaultRevisionEntity
{
public virtual string UserName { get; set; }
}
public class EnversRevisionListener : IRevisionListener
{
private string _userName = "unknown";
public EnversRevisionListener(string userName)
: base()
{
_userName = userName;
}
public void NewRevision(object revisionEntity)
{
var casted = revisionEntity as EnversRevisionEntity;
if (casted != null)
{
casted.UserName = _userName;
}
}
}
これら 2 つを ASP.NET 環境内で使用したいと考えています。コストのかかるアクションであるため、構成およびセッション ファクトリは一度作成されます。トランザクションごとに、新しいセッションが開かれます。
このNHE Jiraの問題とこれに関連するSOの質問から、nHibernateを構成するときにユーザー名をリスナーに登録できることがわかりました。
ただし、トランザクションごとに最初にアプリケーションに接続する人のユーザー名を登録するので、それは私にとっては十分ではありません。
特定のトランザクションに関連するユーザー名をリスナーに提供できるようにする必要があります。
以前は、nHibernate の更新前および更新後のイベント リスナを使用した貧弱な監査を使用していました。ここで、これらのリスナーもセッションではなくセッションファクトリに関連付けられているため、同様の問題に直面しました。したがって、内部のセッションに関連付けることができる古いスタイルのインターセプターに切り替えましたOpenSession
。これにより、現在のユーザーをインターセプターに追加できました。
ただし、Envers の同じ問題を解決する方法がわかりません。誰かが助けてくれることを願っています。