Hibernate保存子类WordDoc时错误插入父表BASEDOC问题咨询
问题原因分析
你遇到的问题根源在于Hibernate默认继承映射策略与你的数据库表结构不匹配。
当继承层级里的所有类(BaseDoc、Doc、WordDoc)都标注@Entity注解时,Hibernate会默认采用**单表继承(Single Table Inheritance)**策略:
- 所有子类的数据都会被存储到最顶层父类对应的
BASEDOC表中,通过鉴别器字段区分不同实体类型。 - 但你的
version字段仅存在于WORD_DOC表,并不在BASEDOC表内,Hibernate却试图将该字段值插入BASEDOC表,自然触发“列不存在”的错误。
另外,你的实体类定义和数据库结构也不匹配:Doc类未指定对应表,数据库中也没有Doc的对应表,这进一步混淆了Hibernate的映射逻辑。
解决方法
根据你的数据库表结构(每个子类对应独立表),需要显式指定**每个类对应一个表(Table Per Class)**的继承策略:
- 在顶层抽象类
BaseDoc上添加继承策略注解:
@Entity @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) public abstract class BaseDoc {}
- 若
Doc仅为中间抽象层、无需单独对应数据库表,将其改为@MappedSuperclass而非@Entity,避免Hibernate将其视为需要映射的实体表:
@MappedSuperclass public class Doc extends BaseDoc {}
配置完成后,Hibernate会将WordDoc的数据直接插入对应的WORD_DOC表,不再尝试往BASEDOC表插入子类特有的字段。
内容的提问来源于stack exchange,提问作者tmsblgh
相关产品推荐
相关产品推荐

