所以,我一直在努力熟悉 JPA 的继承特性,并且到目前为止我真的很喜欢它们。我最近想到的一件事是,它们实际上可以用于检索数据以外的其他用途。鉴于它可以根据鉴别器值获取子类,因此继承实际上是一种将配置字段转换为实现的便捷方式。在那个阶段,我的知识与经验的比率处于“刚好够危险/不足以始终意识到它的区域”,我认为最好问问这是否是个好主意。
以 PRODUCT 和 BILLTYPE 表为例。
Product:
int Id
int billtypeid
Billtype:
int id
varchar[15] description
Billtype 只是产品的一种计费策略(我们会说一些订单可能按重量计费,而另一些可能只是按箱计费)。在开票过程中,每种账单类型都需要使用不同的方法。Billtype 表可能只有少数条目,并且不应该变得非常大。
使用继承来子类化抽象的 Billtype 实体是否有意义,该实体还为发票代码所需的不同方法定义了一个接口?像这样的东西:
@Entity
@DiscriminatorColumn("description")
public abstract class BillType {
// Getters, setters
// Abstract methods that could be used elsewhere - ex:
// BigDecimal calculateInvVal(...)
}
@Entity
@DiscriminatorValue("by case")
public class CaseBillType extends BillType {
// Implementation of calculateInvVal - now when invoicing code needs this method,
// the right one is always associated with the current product!
}
这提供了一种方便的方法来将行为与数据库中表示配置数据的字段相关联,但将业务代码与实体混合在一起(在大多数情况下,这非常顽皮)。可能有一个设计模式来解决我的曲目中缺少的这个问题,但我真的很想避免写很多,“如果账单类型是这样,获取这个子类,如果账单类型是这样,等等“ 代码。
我从答案中寻找的是对这种技术的潜在缺点的解释,我可能看不到这将证明寻找该问题的另一种解决方案是合理的。