在使用任何ORM框架时,我还没有使用继承。我试图通过this文章来理解它,但不明白为什么以及何时需要/涉及的继承。
这有点棘手,看起来很不寻常,因为关系数据库没有继承概念。
在ORM中使用继承有什么好处?是否存在强制性的具体情况?
如果可能,请举例说明。
答案 0 :(得分:2)
例如,PurchaseInvoice
,SalesInvoice
和其他人是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功能(包括继承)是有意义的。
什么是好例子? 不是最好的例子,但考虑到你正在制作一个存储各种植物或动物信息的应用程序。你想把它们分为一个层次结构:水生,空中,哺乳动物,鸟类等。继承可以让你很容易地运行“选择所有哺乳动物”或“选择所有鸟类”等查询。