今回は、エンティティ間の相続関係の設計である冬眠の階層設計について話しましょう。
たぶんこれはより抽象的であるかもしれません。例を直接見てみましょう。
1)まず一般的な慣行を見て、コードを直接入力しましょう。3つの実際のクラスは次のとおりです。
Public Class TitemはSerializable {// Get/Set Method Private int id;を省略します。プライベートストリングの製造;プライベート文字列名; } public class tbook extends titem {// omit get/setメソッドプライベートint pagecount; } public class tdvd extends titem {// omit get/setメソッドプライベート文字列領域コード。 }
ここでは、3つのマッピングファイルが必要です。内容は次のとおりです。
<class name = "titem" table = "item"> <id name = "id" column = "id" type = "java.lang.integer"> <generator/> </id> <プロパティname = "name" name = "name" type = "java.string"/> <プロパティ名= "column"テーブル= "book"> <id name = "id" column = "id" type = "java.lang.integer"> <generator/> </id> <プロパティname = "name" column = "name" type = "java.lang.string"/> <プロパティ名= "製造" column = "column =" kanking "type =" java.lang.string "/> < type = "java.lang.integer"/> </class> <class name = "tdvd" table = "dvd"> <id name = "id" column = "id" "type =" java.lang.integer "> <generator/> </id> <propertion name =" name "column =" "type =" java.lang.stocling "coldure" coldure "coldue" type = "java.lang.string"/> <property name = "RegionCode" column = "regionCode" type = "java.lang.string"/> </class>
通常のマッピングファイルは、以前のファイルと違いはありません。
テスト方法を直接書きましょう。
public void testSelect(){query query = session.createquery( "from titem");リストリスト= query.list(); iterator iter = list.iterator(); while(iter.hasnext()){system.out.println( "name:"+((((titem)iter.next())。getname());}}}}ここでは、特定の単語クラスではなく、TheTheクラスを使用していることに注意してください。ここでは、The TheTheクラスから継承されたサブクラスを自動的に探し、すべての結果を見つけます。これには多型が含まれます。クラスタグにはプロパティの多型があり、そのデフォルト値は暗黙的です。つまり、結果は名前を指定せずにクエリにすることができます。明示的である場合、このタイプの結果を見つける前に、特定のクラス名を指定する必要があることを意味します。
2)前の例では、3つのマッピングファイルを使用しました。変更する必要がある場合は、3つのマッピングファイルを変更する必要がありますが、これは大規模なプロジェクトでは実行不可能です。さらに、各テーブルには、対応するメインクラスに対応するフィールドがあり、これは冗長です。したがって、次の方法があります。
エンティティクラスはまだ1)と同じです。マッピングファイルを3に変更し、The TheTemマッピングファイルのみを保持します。ただし、対応する変更を行う必要があります。コンテンツは次のとおりです。
<class name = "titem" table = "item" polymorphism = "explicit"> <id name = "id" column = "id" type = "java.lang.integer"> <generator/> </id> <プロパティ名= "column =" name "type" type = "java.lang.string"/> <propertion "column" "prencure" "preperture"/> "java. <joined-subclass name = "tbook" table = "tbook"> <key column = "id" /> <property name = "pagecount" column = "pagecount" type = "java.lang.integer" /> < /joined-subclass> < column = "regioncode" type = "java.lang.string"/> </joined-subclass> </class>
ここでは、マッピングファイルのみがありますが、このクラスが現在のクラスから継承することを示す結合サブカラスのタグがあります。<key>はサブテーブルの主要なキーを示します。ここでは、サブテーブルは、サブクラス、Tbook、TDVDに対応する2つのテーブルを指します。サブテーブル内のフィールドのみがプロパティで指定されています。
このようにして、実行後の生成されたテーブルは次のとおりです。
2つのサブクラスに対応するテーブルは、プロパティを介して指定するフィールドのみです。これにより、テーブル内の複数のフィールドが回避されるため、単語テーブルは個別のフィールドのみを維持します。アイテムクラスが変更された場合、変更を加える必要はありません。
3)階層設計を実装する別の方法について学びましょう。これは、テーブルに旗を入れることによって達成されます。 Hibernateマッピングファイルでは、Descriminatorタグを介して実装します。
これ以上苦労せずに、例を見てみましょう。
昨日のTheTheのマッピングファイルを次のように変更しました。
<class name = "titem" table = "item" polymorphism = "explicit"> <id name = "id" column = "id" type = "java.lang.integer"> <generator/> </id> <disfinator column = "category" type = "java.lang.String"/> <プロパティ= "colanid" "/> <property.ling"/> <java。 name = "Manufacture" column = "Manufacture" type = "Java.lang.String"/> </class>
真ん中を見て、差別装置タグを追加しました。これは、2つのサブクラスが際立っているフィールドを示しています。
<subclass name = "tbook" disfinator-value = "1"> <プロパティ名= "pagecount" column = "pagecount"/> </subclass> <subclass name = "tdvd" disfinator-value = "2"> <プロパティ名= "regioncode" column = "regioncode"/>
これらの2つの段落が表示されます。これは、識別子によって指定されたフィールドの値が1である場合、Tbookクラスであり、PageCountに値があることを示しています。判別器によって指定されたフィールドの値が2の場合、それはTDVDクラスであり、リージョンコードに値があることを示します。
このようにして、1つのテーブルを使用する必要があります。これは、それらと複数のクラスの関係を示すものです。この方法はあまりにも多くのサブクラスに良くないことに注意してください。メインテーブルにあまりにも多くのフィールドを引き起こし、特定のデザインの不便を引き起こします。