10

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

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

我了解对属于对象的集合进行非延迟加载的含义,但我不清楚对类进行延迟加载或急切加载的含义。这是否意味着属于该对象的所有集合都将被预先加载?或者这是否意味着 NHibernate 不再使用动态代理来代替实际的类?还有什么?

另外,这里最好的做法是什么?设置该 lazy=false 值是不可取的吗?我应该创建一个类实现的接口,然后将其映射到表吗?还是我应该硬着头皮把所有现有的方法都标记在虚拟类上?

提前感谢您的任何建议!

4

3 回答 3

5

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

当您在类映射中指定“惰性”时(默认),NHibernate 在运行时使用“动态代理”类。此动态代理是从您的类继承的类。然后,据我了解,该类的实例应该延迟/按需初始化。在某些情况下,这对性能应该更好(至少,这是被告知的)。

但是,因为我不喜欢 NHibernate 告诉我我的类应该是什么样子,所以我总是为我的所有类指定lazy=false,我还没有遇到麻烦。:)

于 2009-03-03T14:15:20.987 回答
2

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

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

于 2009-03-03T14:19:59.117 回答
1

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

于 2009-05-10T06:07:58.893 回答