Nhibernate与Lazy的关联真实

时间:2010-07-16 07:43:15

标签: nhibernate

我正在开发一个与N Hibernate一起工作的项目。由于性能问题和项目复杂性的增加,我们需要在代码中手动进行关联。我们都知道,我们必须将lazy属性设置为true。我想知道的是,他们是否有任何方式与set lazy属性关联true.We已经创建了我们自己的方法来填充Association.But仍然为此我们还需要编写许多不满意的查询和代码。

请让我知道一些方法。 谢谢。

1 个答案:

答案 0 :(得分:6)

默认情况下启用延迟加载。基本上有两种方法可以通过NHibernate实现延迟加载。

  1. 延迟加载馆藏
  2. 延迟加载“单端”引用(多对一)
  3. 收藏既简单又直接。如果集合类仍然在NHibernate使用自己的实现,那么在那里实现延迟加载。

    单端引用(“正常”关联)并不那么容易。延迟加载在代理中实现。代理是在运行时创建的类,它继承自引用的类。这就是为什么引用类中的所有内容都需要是虚拟的。代理会覆盖每个成员,并确保在从外部访问成员时加载数据。代理的问题是,如果引用基类,则从基类获取代理,并且不能将其向下转发到实际类。所以在使用延迟加载延迟类时要小心。

    默认情况下,Lazy处于启用状态,您需要明确将其关闭。所以你不需要做任何特殊的事情来获得延迟加载。

    在优化性能时,还要考虑使用批量提取。

    单端关联:

    <class name="xx" batch-size="10"> 
    

    和集合:

    <bag name="xx" .... batch-size="10">
    

    它大大减少了N + 1问题(在这个例子中是10倍)。