2012-04-16 7 views
0

をフェッチ:NHibernateのはHQLにもかかわらず、プロキシを生成するには、私は次の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 

をしかし、問題はそれに対してFETCH持つにもかかわらず、それはまだプロキシとして戻っています。私はこの上でJOINを使用して試してみたが、私の問題は、私は1〜2列からつもり

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

の下にこのオブジェクトの

私のマッピングがあるので、マッピングを受け入れないでしょう。

どのような考えですか?

ありがとう、

答えて

0

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

また、コンポジットIDに解決されます。

以前のプロジェクトでNHibernateのは、私がCompositeBaseEntityクラスを作ったコードの変更の多くを回避するために、私は等しく、GetHashCodeメソッドをオーバーライドしていなかったことを警告し、コードの再利用を促進するために:、

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が私に避けるよう言っていたものを元に戻します!

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のは、比較が行われるべきかを正確に知っているし、それが持っている場合は知っている:に対して平等を比較する2つのキーがありますように、私たちは何かのようになると等しいに& GetHashCodeメソッド()メソッドをオーバーライドする必要がありますそのオブジェクトを第1レベルのキャッシュに格納します(フェッチを指定した通りです)。

詳しい情報はここで見つけることができます:http://nhforge.org/blogs/nhibernate/archive/2010/07/01/nhibernate-and-composite-keys.aspx

0

はあなたにも正しいGetHashCodeメソッドの実装を提供しなければならないことに注意してください。

あなたのEqualsの実装もあまり良くありません。

さらに、両方のメソッドは '静的'値を返す必要があります。私はあなたのクラスを見て何かのようにする必要がありますされていない:私は本当に可能な場合はあなたが別々のクラスであなたのコンポーネントIDを置くことをお勧めします

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 
} 

さらに、現在の実装に欠陥がある可能性があるため、オーバーライドについては次の記事をお読みください。http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx特に継承と基本タイプに関する部分を理解してください。

+0

私のequalsの実装が「うまくない」と言ってもいいですが、それを改善する方法についての提案はできますか? 私はGetHashCode()に言及するために私の答えを編集しました。 –

関連する問題