ORM继承

时间:2009-02-27 14:25:19

标签: inheritance orm

是否有任何真正想要并在ORM工具上使用继承支持,如果是,您认为哪一个提供最佳支持?

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

4 个答案:

答案 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)