web-dev-qa-db-ja.com

休止状態でDiscriminatorValueアノテーションを使用する場合

休止状態でDiscriminatorValueアノテーションを使用するのに最適なシナリオは何ですか?

38
czetsuya

これらの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がいつ入るかを知る必要があります。上記のリンクを参照してください。

46
czetsuya

例を挙げて説明しましょう。 Animalというクラスがあり、Animalクラスの下に爬虫類、鳥などのサブクラスが多数あるとします。

また、データベースにはANIMALというテーブルがあります

---------------------------
ID||NAME      ||TYPE     ||
---------------------------
1 ||Crocodile ||REPTILE  ||
---------------------------
2 ||Dinosaur  ||REPTILE  ||
---------------------------
3 ||Lizard    ||REPTILE  || 
---------------------------
4 ||Owl       ||BIRD     ||
---------------------------
5 ||parrot    ||BIRD     ||
---------------------------

ここでは、列TYPEはDiscriminatorColumnと呼ばれます。この列には、爬虫類と鳥類を明確に分離するデータが含まれているためです。そして、列REPTILEのデータBIRDTYPEは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 {

}
32

単一テーブル戦略を使用したエンティティの継承があり、ディスクリミネーター列の値をエンティティコンクリートクラスのクラス名以外にしたい場合、またはディスクリミネーター列のタイプがSTRINGでない場合。

javadoc で例を挙げて説明します。

7
JB Nizet

クラス階層ごとの休止状態テーブルの説明と1つの例を次に示します。Paymentという名前の基本クラスと、CreditCard、Checkなどの2つの派生クラスがあるとします。

CreditCardやCheckなどの派生クラスオブジェクトを保存すると、Paymentクラスオブジェクトも自動的にデータベースに保存され、データベース内のすべてのデータは確実に基本クラステーブルである単一のテーブルにのみ保存されます。

ただし、ここでは、データベースに1つの追加のディスクリミネーター列を使用する必要があります。この列を使用していない場合、hibernateは例外をスローします。

0
NAJAM HASHMI