我正在扩展一个不会自动生成其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")
我理解为什么会这样,但我需要知道是否有一种有效的方法。
谢谢,
答案 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-会在运行时给出意想不到的结果生成代理对象(在延迟加载的情况下)。