2017-06-07 9 views
1

は、このクラスを考える:エンティティマッピングのゲッターメソッドをオーバーライドしてアノテートできないのはなぜですか?

@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")) 

を追加すると、エラーは変更されません。

+0

[Hibernate:マップされたスーパークラスの属性を無効にする方法](https://stackoverflow.com/questions/5257921/hibernate-how-override-an-attribute-from-mapped-super-class) – crizzis

+0

@crizzisその答えは問題を解決しません。 – Mark

+0

JPAの継承はjavaの継承に従います。したがって、データベース内で使用されているカラムをオーバーライドできますが、マッピング自体はオーバーライドできません。したがって、一度設定されたID列を変更する方法や、既存のフィールドをサブクラスのIDとしてマークする方法はありません。 JPAが抽象クラスのフィールドを選択して(少しずつ名前を付けて一時的にマークする)、サブクラスのプロパティのマッピングを定義することで、JPAに迷惑をかけることができます。https://stackoverflow.com/questions/13874528/what -is-the-purpose-of-accesstype-field-accesstype-アクセスタイプを変更するためのプロパティおよびアクセス – Chris

答えて

-1

エンティティクラスを作成するには、クラスが満たす必要がある要件があります。 Ex。パブリック/プライベートのコンストラクタを持つ必要があります。ここで

は、要件のリストです:

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

は、この情報がお役に立てば幸いです。

+0

私のクラスが満たしていない要件はどれですか? – Mark

+0

私はこれを見ることができます: "クラスは、javax.persistence.Entity注釈で注釈を付けなければなりません。" – RostSunshine

+0

何ですか?それはクラスの唯一の注釈です... – Mark

関連する問題