は、このクラスを考える:エンティティマッピングのゲッターメソッドをオーバーライドしてアノテートできないのはなぜですか?
@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; }
}
をしかし、これは (または「のためのタイプを決定できませんでした」)「が指定されていません識別子」エラーで失敗しますOn SomeEntity。私がスーパークラスからゲッターを取り除くと、それは機能します。このオーバーライド戦略はできませんか?どうしてですか?
サブクラスに
@AttributeOverride(name = "id", column = @Column(name = "ID"))
を追加すると、エラーは変更されません。
[Hibernate:マップされたスーパークラスの属性を無効にする方法](https://stackoverflow.com/questions/5257921/hibernate-how-override-an-attribute-from-mapped-super-class) – crizzis
@crizzisその答えは問題を解決しません。 – Mark
JPAの継承はjavaの継承に従います。したがって、データベース内で使用されているカラムをオーバーライドできますが、マッピング自体はオーバーライドできません。したがって、一度設定されたID列を変更する方法や、既存のフィールドをサブクラスのIDとしてマークする方法はありません。 JPAが抽象クラスのフィールドを選択して(少しずつ名前を付けて一時的にマークする)、サブクラスのプロパティのマッピングを定義することで、JPAに迷惑をかけることができます。https://stackoverflow.com/questions/13874528/what -is-the-purpose-of-accesstype-field-accesstype-アクセスタイプを変更するためのプロパティおよびアクセス – Chris