0

次の HQL ステートメントがあります。

select distinct t from TaskEntity as 
inner join fetch t.Case as c
inner join fetch c.Client as client 
inner join fetch c.Matter as matter

ただし、Matter はそれに対して FETCH を行っていますが、それでもプロキシとして返されます。

このオブジェクトの私のマッピングは以下です

References(x => x.Matter).Columns(new[] {"c_client","c_matter" });

これでJOINを使用しようとしましたが、私の問題は1列から2列になるため、マッピングを受け入れません。

何かご意見は?

ありがとう、

4

2 に答える 2

0

正しいGetHashCode実装も提供する必要があることに注意してください。

Equalsの実装も優れていません。

さらに、両方のメソッドは「静的」値を返す必要があります。私はあなたのクラスを見たことがありませんが、次のようなものになるはずです。

public class TaskEntity
{
    public int AccountNumber { get; protected set; }
    public int CaseNumber { get; protected set; }
    public Client Client { get; set; }
    public Matter Matter { get; set; }

    public TaskEntity(int accountNr, caseNr)
    {
        AccountNumber = accountNr;
        CaseNumber = caseNr;
    }

    protected TaskEntity() {} // Needed for NHibernate proxies
}

可能であれば、コンポーネントIDを別のクラスに配置することを強くお勧めします。

さらに、現在の実装にはおそらく欠陥があるため、override Equalに関する次の記事を読んでください。http://msdn.microsoft.com/en-us/library/bsc2ak47.aspxは、継承と基本タイプに関する部分を特に理解しています。

于 2012-04-19T11:01:42.997 に答える
0

この問題の原因となっている問題を解決しました。

複合 ID にも解決されます。

プロジェクトの早い段階で、Nhibernate は Equals と GetHashCode をオーバーライドしていないことを警告していました。多くのコード変更を回避し、コードの再利用を促進するために、私は CompositeBaseEntity クラスを作成しました。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Case.Infrastructure
{
    public class BaseCompositeEntity : BaseEntity
    {
        public override int GetHashCode()
        {
            return base.GetHashCode();
        }

        public override bool Equals(object obj)
        {
            return base.Equals(obj);
        }
    }
}

このクラスは、Nhibernate が私に避けるように言っていたものを元に戻します! 等しいかどうかを比較する 2 つのキーがあるため、次のようになるように Equals および GetHashCode() メソッドをオーバーライドする必要があります。

public override bool Equals(object obj)
        {
            if (obj == null)
                return false;
            var t = obj as ClientMatterEntity;
            if (t == null)
                return false;
            if (AccountNumber== t.ClientAcconuntNumber && CaseNumber == t.CaseNumber)
                return true;
            return false;
        }

このようにして、Nhibernate は比較がどのように行われるべきかを正確に認識し、そのオブジェクトが第 1 レベルのキャッシュにあるかどうかを認識します (フェッチを指定したように、そうします)。

詳細については、http: //nhforge.org/blogs/nhibernate/archive/2010/07/01/nhibernate-and-composite-keys.aspxを参照してください。

于 2012-04-18T08:43:58.160 に答える