我的模型层有一个相当大的类层次结构,即大约有 200 个类。层次结构的好/坏之处在于它们都具有相同的基类(我在这里不是在谈论 Object 类)。基类和叶类之间的最大距离为 7,层次结构中任何级别的最大类数为 80。我正在使用 nHibernate 从持久存储中保存/加载数据。
问题 nHibernate 生成的查询非常高效。原因是它试图连接查询中不需要的表?
有没有人使用过具有这种类层次结构的 (n)Hibernate?
请参阅NHibernate:仅加载基类对象以查看我的问题的具体示例。
我的模型层有一个相当大的类层次结构,即大约有 200 个类。层次结构的好/坏之处在于它们都具有相同的基类(我在这里不是在谈论 Object 类)。基类和叶类之间的最大距离为 7,层次结构中任何级别的最大类数为 80。我正在使用 nHibernate 从持久存储中保存/加载数据。
问题 nHibernate 生成的查询非常高效。原因是它试图连接查询中不需要的表?
有没有人使用过具有这种类层次结构的 (n)Hibernate?
请参阅NHibernate:仅加载基类对象以查看我的问题的具体示例。
NHibernate 不得不求助于查询这个怪物,因为它不确切知道哪个表包含所需的数据。例如,使用 时session.Get<Vehicle>(100),NHibernate 不知道哪个表包含 ID 为 100 的车辆的数据,因此它必须将 Vehicle、Car、Truck、Bicycle 连接在一起。但是使用session.Get<Truck>(100),NHibernate 知道数据只能驻留在 Truck 表中,因此查询会更加高效,只有一个连接:Vehicle 和 Truck。
因此,如果您无法更改数据库架构,那么我认为您只有一个选择,即在查询时尝试尽可能具体,始终为 NHibernate 提供您需要的确切类型的实体。
如果您可以更改架构,那么我认为您应该尝试简化模型类,避免使用如此大的继承树。NHibernate 提供了许多其他选项来将类连接在一起。
另一种选择是使用一对一而不是加入子类将一个域模型类的信息分成多个类,而不强制它们相互继承。我在使用更小的继承树时遇到了同样的问题(150 个类中大约有 20 个类共享同一个基类,并使用连接子类进行映射)。当家庭达到 20 人时,如果可能的话,我将停止在层次结构中添加更多类,并尝试使用一对一。