0

Hibernate エンティティを持つ:

public class Employee
{
    public virtual int Id { get; set; }
    public virtual int Idc { get; set; }
    public virtual int Ide { get; set; }
    .
    . other properties
    .
}

Id は次のようにマッピングされます。

<id name="Id" unsaved-value="0">
    <generator class="sequence">
        <param name="sequence">employee_id_seq</param>
    </generator>
</id>

Id を除く新しい従業員のすべてのプロパティを入力してから呼び出すsession.Merge()と、既存の従業員とマージする代わりに、Id を除く元の行と同じすべてのプロパティを持つ別の行が作成されます。

それらのプロパティに対応する行のデータベース レベルで代わりに更新を行うことは可能ですか? Idc+Ide一緒に一意であるため、マージする行を識別できるはずです。

ご協力いただきありがとうございます!

4

1 に答える 1

1

NHibernate セッションは、現在ロードされている (永続化されている) すべてのオブジェクトのID マップを維持します。ID マップはエンティティ ID をキーとして使用します。あなたの場合、あなたIdは単純な値であり、新しく作成されたオブジェクトに対して(デフォルトで)int等しいため、セッションで一致する永続エンティティを見つけることができません。代わりに、新しい行がデータベースに追加されます。0session.Merge()

詳細な説明については、クロスセッション操作に関する Ayende の投稿をお読みください。

エンティティの等価性について別の概念を持ちたい場合は、エンティティのメソッドをオーバーライドEquals()GetHashCode()ます。つまり、すべてのプロパティを比較しますが、残念ながら、この場合は役に立ちません。

Equals()参考までに、GetHashCode()使用方法に関するいくつかのリンクを次に示します
。Equals/GetHashCode を NHibernate で上書きする必要がある理由のサンプルはありますか?
NHibernate: Equals と GetHashCode をオーバーライドする理由

編集

データベース レベルで行を更新するには、次の 2 つのオプションがあります。

  1. 次の行に沿って、NHibernate update queryを実行できます。

    Employee emp; // = your new employee instance
    session.CreateQuery(
               "update Employee set Property1 = :property1, ... " +
               "where Idc = :idc, Ide = :ide")
           .SetParameter("idc", emp.Idc)
           .SetParameter("ide", emp.Ide)
           .SetParameter("property1", emp.Property1)
           // other properties
           .ExecuteUpdate();
    

    また、ネイティブ SQL を使用してこれを行うこともできます。session.CreateSQLQuery("...").ExecuteUpdate();

  2. または、最初にエンティティをロードし、そのプロパティを更新してから保存することもできます。

    Employee emp; // = your new employee instance
    Employee oldEmployee = session.Query<Employee>()
        .Where(x => x.Idc == emp.Idc)
        .Where(x => x.Ide == emp.Ide)
        .Single();
    oldEmployee.Property1 = emp.Property1;
    oldEmployee.Property2 = emp.Property2;
    // other properties
    session.SaveOrUpdate(oldEmployee);
    
于 2012-07-26T13:46:12.377 に答える