2010-01-11 87 views
1

问题我已经有很多ClassB的元素ClassA的:NHibernate的 - 与预先加载

public abstract class ClassA: IEntity<ClassA> 
{ 
    public virtual IList<ClassB> ClassBList { get; protected set; } 
    ... 
} 

然后ClassB的引用ClassC元素:

public class ClassB 
{ 

    public ClassC CEntity { get; private set; } 

    public Percentage Percentage{ get; private set; } 
    ... 
} 

这里是ClassA的映射(ClassB的无映射):

 HasMany(a => a.ClassBList).Component(a => 
     { 
      a.References(b => b.CEntity , "IDCEntity").ForeignKey("ID").Cascade.SaveUpdate().Not.LazyLoad(); 
      t.Map(b => b.Percentage, "Percentage"); 
      ...; 
     }).AsBag().Cascade.AllDeleteOrphan().Not.LazyLoad() 

当我从数据库中获取所有classA元素时,它将ClassBi中的所有ClassB st加载,但它不会加载ClassB中的ClassC元素。

我尝试以下HQL:

   var query = session.CreateQuery("select a from ClassA as a left join fetch a.ClassBList as b left join fetch b.CEntity as c"); 

      classAList = query.List<ClassA>(); 

,但我得到这个错误:

Exception = {"Query specified join fetching, but the owner of the fetched association was not present in the select list [FromElement{explicit,not a collection join,fetch join,fetch non-lazy properties,classAlias=c,role=,tableName=ClassCTable,tableAlias=classc2_,or...

我想这是因为我试图CLASSB的渴望负荷ClassC元素,但CLASSB是不在hte选择列表中。

什么是替代方案,或正确的HQL?

注:我不能使用,因为this问题的标准:如果问题通过复杂的关联,跨越3个实体是急于负载

回答

0

,也许this博客文章将帮助