web-dev-qa-db-ja.com

スーパークラスのインスタンス変数にJPAアノテーションを追加することは可能ですか?

2つの異なるテーブルで同じエンティティを作成しています。テーブルマッピングなどを2つのエンティティで異なるようにするために、残りのコードのみを1つの場所(抽象スーパークラス)に配置します。最良の方法は、スーパークラスで列名(同じになるため)などの一般的なものに注釈を付けることができることですが、JPA注釈は子クラスに継承されないため、機能しません。次に例を示します。

public abstract class MyAbstractEntity {

  @Column(name="PROPERTY") //This will not be inherited and is therefore useless here
  protected String property;


  public String getProperty() {
    return this.property;
  }

  //setters, hashCode, equals etc. methods
}

これを継承し、注釈などの子固有のもののみを指定したいと思います。

@Entity
@Table(name="MY_ENTITY_TABLE")
public class MyEntity extends MyAbstractEntity {

  //This will not work since this field does not override the super class field, thus the setters and getters break.
  @Column(name="PROPERTY") 
  protected String property;

}

子クラスでフィールド、ゲッター、セッターを作成する必要がありますか?

ありがとう、クリス

26
Kristofer

MyAbstractEntityに@MappedSuperclassクラスの注釈を付けて、hibernateが子のMyAbstractEntityの構成をインポートし、フィールドをオーバーライドする必要がないようにすることができます。親のを使用するだけです。そのアノテーションは、親クラスも検査する必要があることを休止状態にするためのシグナルです。それ以外の場合は、無視できると想定します。

26
sblundy

これは役立つかもしれないいくつかの説明のある例です。

@MappedSuperclass:

  • コンビニエンスクラスです
  • 子クラスで使用可能な共有状態と動作を保存するために使用されます
  • 持続可能ではありません
  • 子クラスのみが永続化可能です

@Inheritanceは、次の3つのマッピング戦略のいずれかを指定します。

  1. シングルテーブル
  2. 参加しました
  3. クラスごとのテーブル

@DiscriminatorColumnは、子オブジェクトを区別するために使用される列を定義するために使用されます。

@DiscriminatorValueは、子オブジェクトを区別するために使用される値を指定するために使用されます。

次のコードは次のようになります。

enter image description here

Idフィールドは両方のテーブルにありますが、AbstractEntityId @ MappedSuperclassでのみ指定されていることがわかります。

また、@ DisciminatorColumnはPartyテーブルにPARTY_TYPEとして表示されます。

@DiscriminatorValueは、PartyテーブルのPARTY_TYPE列にレコードとしてPersonとして表示されます。

非常に重要なのは、AbstractEntityIdクラスがまったく永続化されないことです。

@Columnアノテーションを指定せず、代わりにデフォルト値に依存しています。

Partyを拡張するOrganizationエンティティを追加し、それが次に永続化される場合、Partyテーブルには次のようになります。

  • id = 2
  • PARTY_TYPE = "組織"

組織テーブルの最初のエントリは次のようになります。

  • id = 2
  • 特に組織に関連付けられているその他の属性値
 
 @ MappedSuperclass 
 @ SequenceGenerator(name = "sequenceGenerator"、
 initialValue = 1、allocationSize = 1)
 public classAbstractEntityIdはSerializableを実装します{ 
 
 private static final long serialVersionUID = 1L; 
 
 @ Id 
 @ GeneratedValue(generator = "sequenceGenerator")
 protected Long id; 
 
 public AbstractEntityId(){} 
 
 public Long getId(){
 return id; 
} 
} 
 
 @ Entity 
 @ Inheritance(strategy = InheritanceType.JOINED)
 @DiscriminatorColumn(name = "PARTY_TYPE"、
 discriminatorType = DiscriminatorType.STRING)
 public class Party extends AbstractEntityId {
 
 public Party(){} 
 
} 
 
 @ Entity 
 @ DiscriminatorValue( "Person")
 public class Person ex傾向があるパーティ{
 
プライベート文字列givenName; 
プライベート文字列familyName; 
プライベート文字列preferredName; 
 @ Temporal(TemporalType.DATE)
 private Date dateOfBirth; 
 privateString性別; 
 
 public Person(){} 
 
 //ゲッターとセッターなど
 
} 
 

お役に立てれば :)

13
Wayne Riesterer

スーパークラスを次のようにマークします

@MappedSuperclass

子クラスからプロパティを削除します。

3

基本クラスに@MappedSuperclassアノテーションを付けると、希望どおりの結果が得られます。

2
Jörn Horstmann