【发布时间】:2017-06-07 13:44:59
【问题描述】:
鉴于这个类:
@MappedSuperclass
public abstract class AbstractEntity {
int id;
public void setId(int id) { this.id = id; }
public int getId() { return id; }
// other mappings
}
我要定义一个实体:
@Entity
public class SomeEntity extends AbstractEntity {
@Override
@Id // or @OneToOne etc.
public int getId() { return id; }
}
但这会失败并显示“未指定标识符” SomeEntity 上的(或“无法确定类型”)错误。如果我从超类中删除吸气剂,它就可以工作。我不能做这个覆盖策略吗?为什么不,或者如果是 - 如何?
添加
@AttributeOverride(name = "id", column = @Column(name = "ID"))
到子类不改错误。
【问题讨论】:
-
@crizzis 这个答案并不能解决问题。
-
JPA 继承遵循 java 继承,因此您可以覆盖数据库中使用的列,但不能覆盖映射本身。因此无法更改设置后使用的 ID 列,也无法将现有字段标记为子类中的 ID。您可以通过让 JPA 获取抽象类中的字段(将它们命名略有不同并将它们标记为瞬态)来欺骗事情,然后定义子类中属性的映射,请参阅stackoverflow.com/questions/13874528/… 以更改访问类型
-
@Chris 谢谢。
So there is no way to... mark an existing field as the ID in a subclass.可能会告诉我我正在尝试以错误的方式做某事。我应该在链接中查看哪些答案,因为那里有相互矛盾的意见。 -
目的是什么,为什么要这样做?并请显示两个类中的其他映射。
标签: java hibernate jpa eclipselink mappedsuperclass