Inheritance ORM遗传

Inheritance ORM遗传,inheritance,orm,Inheritance,Orm,是否有人真的想要并使用ORM工具上的继承支持,如果有,您认为哪一个提供了最好的支持 或者ORM继承是一个“天上掉馅饼”的概念吗?如果你指的是域类中的继承,我一直在使用NHibernate和/或Castle ActiveRecord,它们支持三种映射策略: 我非常喜欢这个问题。我使用ORM工具(Toplink,现在是eclipselink,Hibernate)有一段时间了,我一直认为这是JPA文档中引用的,但我从来没有真正需要它。基本上,我的理念是ORM只是防止您编写tedius代码来提取数

是否有人真的想要并使用ORM工具上的继承支持,如果有,您认为哪一个提供了最好的支持


或者ORM继承是一个“天上掉馅饼”的概念吗?

如果你指的是域类中的继承,我一直在使用NHibernate和/或Castle ActiveRecord,它们支持三种映射策略:


    • 我非常喜欢这个问题。我使用ORM工具(Toplink,现在是eclipselink,Hibernate)有一段时间了,我一直认为这是JPA文档中引用的,但我从来没有真正需要它。基本上,我的理念是ORM只是防止您编写tedius代码来提取数据库的记录。这确实是一个巨大的节省时间的方法,它可以防止你犯愚蠢的错误。当然你可以用它来做一些有趣的事情,但是为什么不把它保存到控制器上(如果你遵循的是MVC),而不是把它放在模型中呢?

      我用Hibernate继承了它(有些用Django继承了它),对此我深表遗憾

      “组合优先于继承”原则对于域类尤其适用。虽然我同意在一些情况下继承在模型级别上是有意义的,但在大多数情况下继承将提供一个非常静态的域模型,其中一个对象将无法更改为另一个类

      我还发现,大多数开发人员对数据库级别的继承概念并不熟悉,因此维护变得更加复杂


      最后,还有一些技术问题,比如Hibernate放置的代理将隐藏对象的实际类。它使“实例”的行为变得僵硬。当然,您可能会说“的实例”是一种代码味道,这可能是另一种暗示,说明组合可能是一种更好的解决方案……

      如果您正在编写复杂的业务软件,您需要它

      比如说,你想把东西卖给个人或组织。在销售订单上,买方可能是其中之一。没有继承权你怎么做

      对于继承,您可以执行以下操作:

      @Entity
      @Inheritance
      public abstract class Party {
      
        @Id
        private Long id;
      
        ...
      }
      
      @Entity
      public class Individual extends Party {
        ...
      }
      
      @Entity
      public class Organization extends Party {
        ...
      }
      
      @Entity
      public class SalesOrder {
      
        private Party buyer;
      
        ...
      }
      
      然后你可以做:


      salesOrder.setBuyer(某个组织)
      salesOrder.setBuyer(某个个人)

      什么是ORM继承?能够从其他实体类派生实体类。谢谢,我会检查它们。@Mauricio我正在处理一个项目,该项目的记录类型我们将称为
      Master
      。主记录大约有17种类型,大多数都有类似的数据字段,但每个都可能有一个或两个唯一的字段。在我之前的人使用继承来创建一个包含17个实体子类的主实体类。起初这看起来很不错,但在使用它一段时间后,我想知道一个允许空值的
      Master
      表是否不是更好(例如,数据库中现在有17个不同的表,我无法轻松地将一种类型更改为另一种类型)。我非常感谢您的想法。@mattblang嗨,Matt,不要把域类中的继承与映射策略混淆起来。您可以将17个子类映射到单个表或单个表,请查看NHibernate文档以供参考。如果您需要将一种类型更改为另一种类型,您已经注意到一般的继承,特别是每个类的表,都不能很好地工作。因此,您认为传统的“每个表一个类”方法适用于大多数情况吗?在我的例子中,这就是我一直发现的。在那里使用继承只会混淆映射IMO,更像是一个玩具,而不是任何有用的东西。从我在这里阅读的内容来看,似乎每个表都有一个简单的类(带有组合)。谢谢你的洞察力,我不同意。如果您记住不能将实体从一个类更改为另一个类,这是一种非常强大的技术,因为它可以让您将常见的OOP知识应用到其他关系模型中。至于检查代理背后的实际类型,它非常难闻。。。使用访问者或多态性:当然,继承与继承是共同的OOP知识,当然,有时继承更方便(哦,不,我听到一场火焰战来了!)——无论如何,这是另一个工具,你可以(或不)使用。@ MuSCH-如果你使用ORM工具,你会认为继承是“或”所不可缺少的吗?“很高兴有”?