休止状態でDiscriminatorValueアノテーションを使用するのに最適なシナリオは何ですか?
これらの2つのリンクは、継承の概念を最もよく理解するのに役立ちます。
http://docs.Oracle.com/javaee/6/tutorial/doc/bnbqn.html
http://www.javaworld.com/javaworld/jw-01-2008/jw-01-jpa1.html?page=6
弁別器を理解するには、まず継承戦略SINGLE_TABLE、JOINED、TABLE_PER_CLASSを理解する必要があります。
Discriminatorは、SINGLE_TABLE継承で一般的に使用されます。これは、レコードのタイプを識別するための列が必要だからです。
例:クラスStudentと2つのサブクラス:GoodStudentとBadStudentがあります。 GoodデータとBadStudentデータの両方が1つのテーブルに格納されますが、もちろん、そのタイプとDiscriminatorColumnがいつ入るかを知る必要があります。上記のリンクを参照してください。
例を挙げて説明しましょう。 Animalというクラスがあり、Animalクラスの下に爬虫類、鳥などのサブクラスが多数あるとします。
また、データベースにはANIMAL
というテーブルがあります
---------------------------
ID||NAME ||TYPE ||
---------------------------
1 ||Crocodile ||REPTILE ||
---------------------------
2 ||Dinosaur ||REPTILE ||
---------------------------
3 ||Lizard ||REPTILE ||
---------------------------
4 ||Owl ||BIRD ||
---------------------------
5 ||parrot ||BIRD ||
---------------------------
ここでは、列TYPE
はDiscriminatorColumnと呼ばれます。この列には、爬虫類と鳥類を明確に分離するデータが含まれているためです。そして、列REPTILE
のデータBIRD
とTYPE
はDiscriminatorValueです。
したがって、Java部分では、この構造は次のようになります。
動物のクラス:
@Getter
@Setter
@Table(name = "ANIMAL")
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING, name = "TYPE")
public class Animal {
@Id
@Column(name = "ID")
private String id;
@Column(name = "NAME")
private String name;
}
爬虫類クラス:
@Entity
@DiscriminatorValue("REPTILE")
public class Reptile extends Animal {
}
鳥のクラス:
@Entity
@DiscriminatorValue("BIRD")
public class Bird extends Animal {
}
単一テーブル戦略を使用したエンティティの継承があり、ディスクリミネーター列の値をエンティティコンクリートクラスのクラス名以外にしたい場合、またはディスクリミネーター列のタイプがSTRINGでない場合。
javadoc で例を挙げて説明します。
クラス階層ごとの休止状態テーブルの説明と1つの例を次に示します。Paymentという名前の基本クラスと、CreditCard、Checkなどの2つの派生クラスがあるとします。
CreditCardやCheckなどの派生クラスオブジェクトを保存すると、Paymentクラスオブジェクトも自動的にデータベースに保存され、データベース内のすべてのデータは確実に基本クラステーブルである単一のテーブルにのみ保存されます。
ただし、ここでは、データベースに1つの追加のディスクリミネーター列を使用する必要があります。この列を使用していない場合、hibernateは例外をスローします。