代码之家  ›  专栏  ›  技术社区  ›  Ben Aston

NHibernate标准获取模式

  •  1
  • Ben Aston  · 技术社区  · 14 年前

    我有一个Type1,它的属性Type2s由 List<Type2> . 我为属性配置了NHibernate映射,如下所示:

    [Map(0, Table = "Type2s", Schema = "MySchema", Cascade = CascadeStyle.All, Lazy = true, Inverse = true)]
    [Key(1, Column = "Type1Id")]
    [OneToMany(2, Class = "Type2, MyNamespace")]
    

    这两个检索Type1实例的标准在行为上有什么不同:

    var criteria1 = DetachedCriteria.For<MyType1>();
    
    var criteria2 = DetachedCriteria.For<MyType1>().SetFetchMode("Type2s", FetchMode.Join);
    

    当我从这些条件中调用可执行条件上的.List时,可能只有在我实际尝试访问属性时才会运行SQL来检索与每个Type1实例关联的Type2,因为该属性被标记为惰性。这是正确的假设吗?

    如果我想强制评估惰性属性,如何才能达到最佳效果?

    1 回复  |  直到 14 年前
        1
  •  1
  •   ddango    14 年前

    我不太熟悉属性绑定与hbm/fluent的对比,但我相信您已经解决了自己的问题!

    假设Type2s的数据在请求之前不会加载,这是正确的,因为包很懒。第二个条件的fetchmode强制这些对象同时水合,即在一次数据库往返中。

    作为旁白,FetchMode.Join相当于FetchMode.eagery(在我看来这是一个更好的名字:懒惰)。

    文章解释得更深入一点: http://davidhayden.com/blog/dave/archive/2008/12/06/ImprovingNHibernatePerformanceFetchingStrategiesFetchModeFluentNHibernate.aspx

    描述 FetchMode.Join FetchMode.Eager http://bchavez.bitarmory.com/archive/2008/04/04/differences-between-nhibernate-fetchmode.eager-and-fetchmode.join.aspx