有没有人 真 想要并在ORM工具上使用继承支持,如果是,您认为哪一个提供最好的支持?
或者ORM继承是“天上的馅饼”概念?
有没有人 真 想要并在ORM工具上使用继承支持,如果是,您认为哪一个提供最好的支持?
或者ORM继承是“天上的馅饼”概念?
我很喜欢这个问题。我已经使用ORM工具(Toplink,现在是eclipselink,Hibernate)一段时间,我一直认为这是JPA文档中引用的,但我从来没有真正需要它。基本上我的理念是ORM只是为了阻止你编写tedius代码来提取数据库的记录。这确实是一个巨大的节省时间,它可以防止你犯下愚蠢的错误。当然你可以用这个做一些奇特的东西,但为什么不把它保存到控制器(如果你跟随MVC)而不是把它粘在模型中?
我已经使用了Hibernate的继承(以及一些使用Django),并且非常遗憾。
对于域类,“基于继承的组合”原则尤其如此。虽然我同意在某些情况下继承在模型级别有意义,但在大多数情况下,继承将为您提供一个非常静态的域模型,其中一个对象将无法更改为另一个类。
我还发现大多数开发人员对数据库级别的继承概念不满意,因此维护变得更加复杂。
最后,还有一些技术问题,比如Hibernate设置的代理将隐藏对象的实际类。它使“实例”表现得很苛刻。当然,你可能会说“实例”是代码气味,也许这是另一个暗示,组成可能是一个更好的解决方案......
如果你的意思是域类中的继承,我会一直使用NHibernate和/或Castle ActiveRecord,它们支持三种映射策略:
如果您正在编写复杂的商业软件,那么您需要它。
假设您希望能够向个人或组织销售产品。在销售订单上,买方将是一个或另一个。没有继承你怎么做?
继承,你会做这样的事情:
@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(someOrganization)
要么 salesOrder.setBuyer(someIndividual)