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