【问题标题】:Why can I not override and annotate a getter method for entity mapping?为什么我不能覆盖和注释实体映射的 getter 方法?
【发布时间】: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


【解决方案1】:

要创建实体类,该类必须满足一些要求。前任。必须有一个公有/私有构造函数。

这里是要求列表:

http://docs.oracle.com/javaee/5/tutorial/doc/bnbqa.html

希望这会有所帮助。

【讨论】:

  • 我的班级有哪些要求不符合?
  • 据我所见:“该类必须使用 javax.persistence.Entity 注释进行注释。”
  • 那么我不确定。我知道这可能是一个压倒一切的错误。查看来自主要 cmets 的链接
猜你喜欢
  • 2021-05-24
  • 2020-12-12
  • 1970-01-01
  • 1970-01-01
  • 2015-08-16
  • 1970-01-01
  • 2018-05-02
  • 2016-12-02
相关资源
最近更新 更多