【问题标题】:Is (n)Hibernate suitable for a model layer with more than 200 classes arranged in a hierarchy?(n)Hibernate 是否适用于具有 200 多个按层次结构排列的类的模型层?
【发布时间】:2013-09-17 18:26:43
【问题描述】:

我的模型层有一个非常大的类层次结构,即大约有 200 个类。层次结构的好/坏之处在于它们都具有相同的基类(我在这里不是在谈论 Object 类)。基类和叶类之间的最大距离为 7,层次结构中任何级别的最大类数为 80。我正在使用 nHibernate 从持久存储中保存/加载数据。

问题 nHibernate 生成的查询非常高效。原因是它尝试连接查询中不需要的表?

有没有人使用过具有这种类层次结构的 (n)Hibernate?

请参阅NHibernate: Load base class objects only 以查看我的问题的具体示例。

【问题讨论】:

    标签: database hibernate nhibernate fluent-nhibernate


    【解决方案1】:

    NHibernate 不得不求助于查询这个怪物,因为它不知道哪个表包含所需的数据。例如,对于session.Get<Vehicle>(100),NHibernate 不知道哪个表包含 ID 为 100 的车辆的数据,因此它必须将 Vehicle、Car、Truck、Bicycle 连接在一起。但是使用session.Get<Truck>(100),NHibernate 知道数据只能驻留在 Truck 表中,因此查询效率会高得多,只有一个连接:Vehicle 和 Truck。

    因此,如果您无法更改数据库架构,那么我认为您只有一个选择,即在查询时尝试尽可能具体,始终为 NHibernate 提供您需要的确切实体类型。

    如果你可以改变你的架构,那么我认为你应该尽量简化模型类,避免这么大的继承树。 NHibernate 提供了许多其他选项来将类连接在一起。

    另一种选择是使用一对一而不是joined-subclass将一个域模型类的信息分成多个类,而不强制它们相互继承。我在使用更小的继承树时遇到了同样的问题(150 个类中大约有 20 个类共享同一个基类,并使用连接子类进行映射)。当家庭达到 20 人时,如果可能的话,我将停止向层次结构中添加更多类,而是尝试使用一对一。

    【讨论】:

    • 您好,Doan,感谢您的反馈!但我肯定在这里遗漏了一些东西......您能否指出互联网上的一些帮助材料,以获得一对一的选项。我的困惑是,如果我想在我的域模型中保留继承但允许修改映射,我的映射将是什么?即对于具有一个基类和三个派生类的模型?根据 Ayende 的博客 (nhibernate-mapping-one-to-one),如果表 A 中的一行映射到表 B 中的一行,则一对一将起作用,如果表 A 中的一行可能映射,则一对一将不起作用到表 B 或表 C 中的一行?
    • 如果你也不能改变你的课程,那么我想不出任何其他方式。和我一起,我可以做到。在我的项目中,解决这个问题的方法是观察到one-to-oneforeign id 生成策略具有与joined-subclass 继承映射完全相同的数据库结构。例如,类 B 扩展 A,使用 joined-subclass 将生成与 A 具有 B 类型的 one-to-one 属性的情况完全相同的数据库表结构。这样,您可以将某些继承更改为组合。 “优先组合胜过继承”是必不可少的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-23
    • 1970-01-01
    相关资源
    最近更新 更多