lazy =“ false”是什么影响?关于NHibernate映射的类元素?

StackOverflow https://stackoverflow.com/questions/606488

  •  03-07-2019
  •  | 
  •  

我正在使用遗传系统,我正在尝试添加NHibernate。我有一个类,我需要映射到一个表,但它有许多不是虚拟的现有方法。

我发现如果我设置“懒惰”,我可以让NHibernate成功加载映射,即使存在非虚拟方法也是如此。将映射文件的class元素的属性设置为“false”。我想知道这会对我在这个类中使用NHibernate产生什么影响。

我理解属于对象的集合上非延迟加载的含义,但我不清楚类的延迟或急切加载的含义。这是否意味着属于该对象的所有集合都会急切加载?或者它是否意味着NHibernate不再使用动态代理来代替实际的类?还有别的吗?

此外,这里最好的行动方案是什么?设置lazy = false值是不可取的?我应该创建该类实现的接口,然后将其映射到表吗?或者我应该咬紧牙关并在虚拟类上标记所有现有方法?

提前感谢任何建议!

有帮助吗?

解决方案

我总是在NHIbernate的类级别指定lazy = false,因为我不希望NHibernate强迫我声明属性是虚拟的,如果我不想在我的类模型中这样做。

在类映射(默认)中指定'lazy'时,NHibernate在运行时使用“动态代理”类。此动态代理是一个继承自您的类的类。 然后,据我所知,该类的实例应该是懒惰/按需初始化。 在某些情况下,这应该对性能更好(至少,这就是所说的)。

但是,既然我不喜欢NHibernate告诉我我的课程应该是什么样的,我总是为我的所有课程指定lazy = false,而且我还没有遇到麻烦。 :)

其他提示

使用延迟加载在限制对象数量方面非常有效。在某些情况下,此功能非常有用。例如,假设您有两个对象User和Role,并且所有Users都有一个或多个角色。加载User对象时,您还需要加载其所有关联的角色。但是,当您为该用户加载角色时,您不希望加载与该角色关联的所有用户,因为这可能会最终加载整个用户数据库。

因此设置lazy = false意味着在加载调用实例时将加载关系的整个对象集合。在某些情况下,这很好,很好,也很合适,在其他情况下,这可能会导致性能问题。

罗布 那只是糟糕的设计。用户将具有类型角色的列表,但角色将不具有用户类型的列表。用户是聚合根,为了让角色中的所有用户,在User to GetByRole()上定义一个方法。像你描述的2路遍历制作了一个可怕的域模型。谷歌的“循环引用”,看看它为什么不好。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top