我有一些实体看起来像这样:
@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
}
超类中定义的byte[]
是每个子类实体感兴趣的部分。我想要子类化的原因是为了强制执行类型规则,因为程序的某些部分需要EntityThree
,而程序的一些部分则需要EntityTwo
。CCD_ 4将具有完全不同的含义。
这感觉有点奇怪,因为我不希望任何子类会添加任何字段或方法。。。所以我只把继承作为一种打字工具。
这个设计合理吗?实现这一点的更好方法是什么?它是否打破了任何最佳实践?
这是一个很好的OO实践。对于数据库,请使用SINGLE_TABLE继承策略(默认策略),并可能为每个子类使用自定义的@DiscriminatorValue,否则您将在表中获得类名。
从DBA的角度来看,这与使用具有属性TYPE的单个类没有区别。
对于OO,子类可能更有用,例如,您可以使用它以不同的方式实现某些方法,或者实现访问者或策略模式,而不是乏味的if-then-else或instanceof结构。
如果不知道确切的用例,很难说,但看起来你只想重用所有实体中的公共字段,但没有其他实体会引用AbstractEntity-只引用一个特定的子类。在这种情况下,应该使用@MappedSuperclass而不是@Entity来映射超类。每个实体都有自己的表,并且可以覆盖映射超类中定义的映射。
请注意,如果我错了,并且您确实需要实体继承,那么使用instanceof
(至少与Hibernate一起使用)会引起问题,因为您可能有基类的代理,它还不知道外键指向的确切子类,因此它不是任何子类的实例。