有没有办法覆盖继承的生成策略?

时间:2011-10-10 09:25:28

标签: java hibernate inheritance jpa

我正在扩展一个不会自动生成其ID的实体。

我想在我的派生类中“覆盖”它的生成策略为AUTO。

像这样。

@Entity
public class Base {

    @Id
    @Column(name = "id")
    public Integer getId() {
      return id;
    }

}

@Entity
public class Extender extends Base {

    @GeneratedValue(strategy = GenerationType.AUTO)
    public Integer getId() {
        return super.getId();
    }
}

这是我尝试时所得到的:

Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: Extender column: id (should be mapped with insert="false" update="false")

我理解为什么会这样,但我需要知道是否有一种有效的方法。

谢谢,

2 个答案:

答案 0 :(得分:2)

这是不可能的,因为您只能定义主键一次,GeneratedValue只能定义主键。与规范中的单词相同:

  2.4主键和实体身份
  ...主键必须在实体层次结构中只定义一次。

     

11.1.17 GeneratedValue Annotation
  ... GeneratedValue注释可以与Id注释一起应用于实体或映射超类的主键属性或字段。

答案 1 :(得分:0)

这看起来不正确。如果要使用继承,则必须

  • 在基类中指定@javax.persistence.Inheritance并选择一个策略如何映射继承(枚举InheritanceType
  • 使用Base
  • 注释课程@javax.persistence.MappedSuperclass

另请参阅注释@javax.persistence.Transient,它使您可以在超类或超级接口中定义属性,而无需在那里指定映射。

我根本不喜欢数据模型中的继承,因为开发人员倾向于使用instanceof运算符,如果你没有实体类的实际实例但是Hibernate-会在运行时给出意想不到的结果生成代理对象(在延迟加载的情况下)。