我有一些如下所示的实体:
@Entity
public abstract class AbstractEntity{
@Id
private Long id;
String name;
User author;
@Lob
byte[] data;
}
public class EntityOne extends AbstractEntity{
// nothing new
}
public class EntityTwo extends AbstractEntity{
// nothing new
}
public class EntityThree extends AbstractEntity{
// nothing new
}
父类(super class)中定义的byte[]
是每个子类实体中有趣的部分。我想要子类化的原因是强制执行键入规则,因为程序的某些部分需要 EntityThree
,而程序的某些部分需要 EntityTwo
。 byte[]
在不同的子类中具有完全不同的含义。
感觉有点奇怪,因为我不期望任何子类会添加任何字段或方法......所以我仅将继承用作打字工具。
这样的设计合理吗?有更好的方法来实现这一点吗?它是否违反了任何最佳实践?
最佳答案
这是一个很好的面向对象实践。对于数据库,使用 SINGLE_TABLE 继承策略(默认),并且可能为每个子类使用自定义 @DiscriminatorValue,否则您将在表中获得类名。
从 DBA 的角度来看,这与使用具有 TYPE 属性的单个类没有区别。
对于面向对象,子类可能更有用,例如您可以使用它以不同的方式实现某些方法或实现访问者或策略模式,而不是繁琐的 if-then-else 或 instanceof 结构。
关于java - 在 JPA 中使用继承来实现数据类型目的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8765660/