子类继承父类JPA属性时,能否为继承字段的@OneToOne注解新增属性?
结论
你给出的实现方式不能正常生效,大概率会直接导致项目启动阶段就报错。
问题根源
- 两个
trade字段完全独立:父类的trade是private修饰的私有字段,子类本身无权访问,你在子类中声明的同名trade只是新增了一个毫无关联的新字段,不是对父类字段的覆盖。JPA实现(如Hibernate)会同时识别到父子类两个同名的映射字段,直接触发字段冲突错误。 - JPA没有字段覆盖注解的机制:就算你把父类的
trade改为protected修饰,也无法通过子类声明同名字段的方式覆盖父类的JPA注解配置,只会导致实体映射逻辑混乱。
可行的替代方案
如果你完全不能修改父类BusinessBody的代码,可以选择以下两种合规实现:
- 用XML映射文件覆盖配置
JPA规范中XML映射配置的优先级高于注解,你可以在orm.xml中单独为MyBusinessBody的trade关联配置cascade = CascadeType.ALL,不需要修改任何现有Java代码。 - 调整父类注解位置后子类重写Getter
如果允许对父类做少量非逻辑修改,可以把父类trade字段上的@OneToOne注解移到对应的getTrade()方法上,子类重写getTrade()方法,在子类的Getter方法上添加带级联配置的@OneToOne注解即可生效。
内容的提问来源于stack exchange,提问作者J.E.Y
相关产品推荐
相关产品推荐

