休止状態で DiscriminatorValue アノテーションを使用する最適なシナリオはいつですか?
4 に答える
これらの 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 と) DiscriminatorValue が入力されます。
Student クラスに注釈を付ける
@Entity
@Table(name ="Student")
@Inheritance(strategy=SINGLE_TABLE)
@DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING,
name = "Student_Type")
public class Student{
private int id;
private String name;
}
不良学生クラス
@Entity
@DiscriminatorValue("Bad Student")
public class BadStudent extends Student{
//code here
}
良い学生クラス
@Entity
@DiscriminatorValue("Good Student")
public class GoodStudent extends Student{
//code here
}
したがって、StudentテーブルにはStudent_Typeという名前の列があり、その中に Student のDiscriminatorValueが保存されます。
-----------------------
id|Student_Type || Name |
--|---------------------|
1 |Good Student || Ravi |
2 |Bad Student || Sham |
-----------------------
上に投稿したリンクを参照してください。
単一テーブル戦略を使用したエンティティの継承があり、識別子列の値をエンティティの具象クラスのクラスの名前以外にする場合、または識別子列の型が STRING でない場合。
これはjavadocで例を挙げて説明されています。
クラス階層ごとの hibernate テーブルの説明と 1 つの例を次に示します。Payment という名前の基本クラスと、CreditCard、Check などの 2 つの派生クラスがあるとします。
CreditCard や Check などの派生クラス オブジェクトを保存すると、自動的に Payment クラス オブジェクトもデータベースに保存され、データベースではすべてのデータが 1 つのテーブルにのみ保存されます。これは確かに基本クラス テーブルです。
ただし、ここではデータベースで追加の識別子列を 1 つ使用する必要があります。これは、どの派生クラス オブジェクトが基本クラス オブジェクトと共にテーブルに保存されているかを識別するためだけです。この列を使用していない場合、hibernate は例外をスローします。