代码之家  ›  专栏  ›  技术社区  ›  ActiveX

Hibernate,nhibernate紧急加载不工作(忽略)

  •  0
  • ActiveX  · 技术社区  · 8 年前

    所有的,

    使用nhibernate 5.x,asp.net 4.6.1

    我有以下联系:

    项目地址=>项目=>区域

    我想查询项目地址,急切地加载项目和项目地区(以及项目所在国),…该项目是迫不及待地加载,但项目区域不是!当我在调试器中检查时,项目上的区域是代理类型。我试了各种各样的问题都没有成功:

     var address = session.CreateCriteria<ProjectAddress>()
                    .Add(Expression.Eq(Projections.Id(), addressId))
                    .SetFetchMode("Project", NHibernate.FetchMode.Join)
                    .SetFetchMode("Project.Region", NHibernate.FetchMode.Join)
                    .SetFetchMode("Project.Country", NHibernate.FetchMode.Join)
                    .UniqueResult<ProjectAddress>();
    

    var address = session.Session.Query<ProjectAddress>()
                    .Where(x => x.Id == addressId)
                    .Fetch(x => x.Project)
                    .ThenFetch(p => p.Region)
                    .ThenFetch(p => p.Country)
                    .Single();
    

    我在其他查询中也做过这样的工作,为什么在这种情况下不工作超出了我的能力范围。这里的映射没有什么特别之处(project=>region)。我的映射:

    [ManyToOne(Column = "region_id",
                   ClassType = typeof(Region),
                    NotNull = false)]
        public virtual Region Region
        {
            get { return _region; }
            set { _region = value; }
        }
    
    1 回复  |  直到 8 年前
        1
  •  0
  •   ActiveX    8 年前

    好吧,我找到问题了。project.region,project.country之所以是代理,是因为在加载项目地址之前,我已将项目加载到其他地方的会话中(没有急于加载区域/国家)。 因此,在这之后,我加载项目地址,hibernate不再获取项目(因此忽略我的获取策略),而是在会话中使用缓存的项目。 在加载我的项目地址之前,可以通过调用session.evictall()来验证这一点。

    在hibernate中有没有一种方法可以显式地告诉您执行完全查询(不使用exit())?