2011-04-25 10 views
5

我々は、デフォルトのidとジェネレータを定義@MappedSuperclass class Entityを持っている:mapped-superclassで宣言された@GeneratedValueをオーバーライドする方法は?

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Override 
public K getId() { 
    return id; 
} 

私は主キーを自分で提供しますので、私は、全くサブクラスFoo内の任意の発電機を使用しないようにしたいです。

基本クラスEntityからFooを拡張する必要があります。この基本クラスには多くの機能と多くの機能が依存するためです。注釈@AttributeOverridesは、@GeneratedValueを上書きすることはできないようです。

+0

[Hibernate/JPA注釈を使用してGenerationType戦略を上書きするにはどうすればよいですか?](http://stackoverflow.com/questions/328202/how-do-i-override-the-generationtype-strategy-using- hibernate-jpa-annotations) –

答えて

0

Fooのような音は実際にはEntityのサブタイプではなく、実際にはそれを拡張してはいけません。継承は強い契約です。いくつかのメソッドにアクセスするために何かを拡張することはありません。

hibernateでは、データベースからFooオブジェクトを取得すると、実際にはエンティティテーブルからも選択されます。両方のテーブルが@Idフィールドで結合されている場合は、IdFooIdと同じEntityになります。

これにより、以下のことが可能になります。

Entity entity = new Foo(); 
if (entity instanceof Foo) { 
    //we have a Foo object 
} else if(entity instanceof ...) { 
    //we have a ... 
} 

独自のIDを指定する場合は、スーパークラスを拡張しないでください。たくさんのハイバネートクラスに含めるが、実際にクラスのサブタイプではないロジックがたくさんある場合は、代わりに@Embeddedの使用を検討してください。

+0

Xieは彼の基本クラスがマップされたスーパークラスでエンティティではないので、彼のmappedsuperclassはテーブルにマッピングされないので、joinの問題は到着しないと言いました。ベースクラスのidに抽象メソッドを使用し、派生クラスのゲッターメソッドに注釈を付けることは、そうであるようです。 – Shailendra

関連する問題