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;
}
子クラスでフィールド、ゲッター、セッターを作成する必要がありますか?
ありがとう、クリス
MyAbstractEntityに@MappedSuperclass
クラスの注釈を付けて、hibernateが子のMyAbstractEntityの構成をインポートし、フィールドをオーバーライドする必要がないようにすることができます。親のを使用するだけです。そのアノテーションは、親クラスも検査する必要があることを休止状態にするためのシグナルです。それ以外の場合は、無視できると想定します。
これは役立つかもしれないいくつかの説明のある例です。
@MappedSuperclass:
@Inheritanceは、次の3つのマッピング戦略のいずれかを指定します。
@DiscriminatorColumnは、子オブジェクトを区別するために使用される列を定義するために使用されます。
@DiscriminatorValueは、子オブジェクトを区別するために使用される値を指定するために使用されます。
次のコードは次のようになります。
Idフィールドは両方のテーブルにありますが、AbstractEntityId @ MappedSuperclassでのみ指定されていることがわかります。
また、@ DisciminatorColumnはPartyテーブルにPARTY_TYPEとして表示されます。
@DiscriminatorValueは、PartyテーブルのPARTY_TYPE列にレコードとしてPersonとして表示されます。
非常に重要なのは、AbstractEntityIdクラスがまったく永続化されないことです。
@Columnアノテーションを指定せず、代わりにデフォルト値に依存しています。
Partyを拡張するOrganizationエンティティを追加し、それが次に永続化される場合、Partyテーブルには次のようになります。
組織テーブルの最初のエントリは次のようになります。
@ 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(){} //ゲッターとセッターなど }
お役に立てれば :)
スーパークラスを次のようにマークします
@MappedSuperclass
子クラスからプロパティを削除します。
基本クラスに@MappedSuperclass
アノテーションを付けると、希望どおりの結果が得られます。