JPA单表继承中新增抽象实体类的注解选择疑问
JPA单表继承中新增抽象实体类的注解选择疑问
你好呀!针对你的问题,答案很明确——只需要给DigitalProduct标注@Entity就足够了,不需要额外加@MappedSuperclass,具体原因和注意事项如下:
- 你的整个继承体系依然是基于
SINGLE_TABLE单表继承的,所有实体(包括新增的抽象类DigitalProduct)都对应同一个products表。DigitalProduct作为继承链中的一环,标注@Entity才能让JPA将它纳入到这个单表继承的实体层次中,确保通用字段和方法能正确映射到表中。 - 不需要给
DigitalProduct指定@DiscriminatorValue,因为它是抽象类,不会有实例被持久化到数据库里,JPA只需要用鉴别器值区分那些可实例化的具体实体(也就是Book和EBook)就可以了。 - 如果使用
@MappedSuperclass,这个类就不再是JPA实体,仅仅是一个用来共享映射信息的父类,无法被纳入到实体继承体系中。而你这里的DigitalProduct是作为实体继承链的中间节点存在的,所以@MappedSuperclass并不适配这个场景。
给你补充一下正确的DigitalProduct写法示例:
@Entity public abstract class DigitalProduct extends Product { // 在这里定义数字产品通用的字段和方法 }
你的EBook类修改后的写法完全没问题,保持原有的@DiscriminatorValue("2")即可:
@Entity @DiscriminatorValue("2") public class EBook extends DigitalProduct { // EBook特有的字段和方法 }
备注:内容来源于stack exchange,提问作者Michael Linker
相关产品推荐
相关产品推荐

