为什么我们需要在JPA(ORM)中继承?

时间:2014-03-21 22:06:46

标签: hibernate inheritance jpa orm eclipselink

在使用任何ORM框架时,我还没有使用继承。我试图通过this文章来理解它,但不明白为什么以及何时需要/涉及的继承。

这有点棘手,看起来很不寻常,因为关系数据库没有继承概念。

在ORM中使用继承有什么好处?是否存在强制性的具体情况?

如果可能,请举例说明。

2 个答案:

答案 0 :(得分:2)

例如,PurchaseInvoiceSalesInvoice和其他人是Invoice的子类。在StockMovement中,您可以拥有一个引用任何Invoice

的属性
public class StockMovement {

    @ManyToOne
    public Invoice invoice;

}

这是从OOP的角度来看。您可以轻松检索Invoice中共享的常用信息,例如:

for (StockMovement stockMovement: allResult) {
    stockMovement.invoice.number;
    stockMovement.invoice.date;
}

继承很优雅但不是必需的。如果您不想使用继承,或者您在JPA提供商中遇到某些限制,则可以将发票的ID存储在StockMovement中。例如:

@Entity
public class StockMovement {

     @Embedded public InvoiceId invoiceId;

}

@Embeddable
public class InvoiceId {

     public String invoiceId;

     public int invoiceType;
}

要检索数据,您必须手动执行查询:

for (StockMovement stockMovement: allResult) {
    if (stockMovement.invoice.invoiceType == 0) {
        execute query "FROM PurchaseInvoice p WHERE p.id = " + stockMovement.invoice.invoiceId);
    }
    if (stockMovement.invoice.invoiceType == 1) {
        execute query "FROM SalesInvoice p WHERE p.id = " + stockMovement.invoice.invoiceId);
    }
}

如果你使用继承,你可以避免这种讨厌的if

答案 1 :(得分:0)

ORM为什么要继承? 继承是面向对象的编程概念,ORM(对象关系映射)的目标是将代码中面向对象的类无缝链接到数据库中的表。因此,包含所有OOP功能(包括继承)是有意义的。

什么是好例子? 不是最好的例子,但考虑到你正在制作一个存储各种植物或动物信息的应用程序。你想把它们分为一个层次结构:水生,空中,哺乳动物,鸟类等。继承可以让你很容易地运行“选择所有哺乳动物”或“选择所有鸟类”等查询。