在JPA中将继承用于数据类型目的



我有一些实体看起来像这样:

@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一起使用)会引起问题,因为您可能有基类的代理,它还不知道外键指向的确切子类,因此它不是任何子类的实例。

最新更新