0

私は2つのクラスを持っています.1つはエンティティクラスではなく、すべてのエンティティクラスに共通のフィールドを持つAと仮定します.もう1つはエンティティクラスを拡張するエンティティクラスです.これらのクラスを以下のように定義する方法.

public class A{
     private Date startDate;
     private Date endDate;
     //setters and getters for these fields
     }

@Entity
@Table(name="some table name")
public class B extends A{
     private long id;
     private String duration;
public B(){

    }
public B(Date startDate,Date endDate,String duration){
     //setter methods for the fields inside the constructor             
    }
    //Setter ,Getter methods for the fields in B class
   }

今問題は、アプリケーションを実行すると、B クラスで定義されたフィールドのみでテーブルが作成されることです。テーブルにはスーパー クラス (クラス A) のフィールドがありません。

4

1 に答える 1

5

非エンティティ クラスからの継承は、永続的な属性を継承しません。JPA (2.0) 仕様では、これは次の言葉で伝えられます。

非エンティティ スーパークラスは、動作の継承のみを目的としています。非エンティティ スーパークラスの状態は永続的ではありません。非エンティティ スーパークラスから継承された状態は、継承エンティティ クラスでは永続的ではありません。

持続性マッピングのみを継承することが目標である場合、MappedSuperClassを使用すると目標が達成されます。アイデアは、同じマッピングされたスーパークラスを拡張する複数のエンティティに、永続的なマッピングのみが継承され、場合によっては再利用されるということです。永続性の観点からは、マップされたスーパークラス A と拡張エンティティ B の間に関係はなく、永続性マッピングの再利用のみです。マッピングが適切であれば、必要なのは@MappedSuperClassclass に注釈を追加することだけAです。

クエリとリレーションシップでスーパー クラス A を使用する場合は、エンティティにする必要があります (マップされたスーパークラスは機能しません)。開始するには、 Java EEチュートリアルから対応する部分を読むことをお勧めします。

于 2012-06-27T04:51:33.583 に答える