1。コレクションマッピング
1。コレクションの紹介
コレクションマッピングも基本的なマッピングですが、開発プロセス中は頻繁に使用されるわけではないため、深い理解を深める必要はありません。基本的な使用方法を理解するだけです。開発プロセス中にそのような問題に遭遇したときに、ソリューションを照会できるようになります。対応するセットマッピング実際には、Javaのセットを対応するテーブルにマッピングすることを指します。コレクションオブジェクトのマッピングです。 Javaには4種類のセットがあります。つまり、セット、マップ、リスト、通常の配列です。それらには大きな違いがあります:
(1)設定、オブジェクトが重複していない必要があり、オブジェクトは無秩序です。
(2)リストは、繰り返されるオブジェクトで注文できます。
(3)マップ、キー値のペアに表示されます。
(4)配列を繰り返すことができ、オブジェクト間に順序があります。
それらの違いは、開発中に使用されるコレクションを決定します。通常、セットは開発中に使用されます。その中のオブジェクトは不要であり、内部オブジェクトはイテレーターを使用して取得できます。これらのセットが対応するリレーショナルモデルにマッピングする場合は、Hibernate、<set>、<list>、<map>、および<array>が提供するマッピングタグを使用する必要があります。
2。マッピングの紹介
セットマッピングの関係モデルについて引き続き議論します。セットマッピングとは、別のオブジェクトコレクションに対応するオブジェクトを指します。保存すると、Hibernateはデータセットを対応するテーブルに保存し、割り当てられるIDに従ってデータをデータテーブルに保存します。新しいテーブルが個別にセットに割り当てられている場合、IDはセットテーブルのIDに割り当てられ、対応する関係テーブルは次のとおりです。
3。クラスファイル
セットマッピングがコードを介して実装される方法と、次に詳細に分析します。ここでは、すべてのコレクションをクラスに封印します。このクラスCollectionMapping.javaを呼び出すため、対応する内部コードは次のとおりです。
パッケージcom.hibernate; java.util.listをインポートします。 java.util.mapをインポートします。 java.util.setをインポートします。 @suppresswarnings( "rawTypes")public class collectionmapping {// id private int id; public int getid(){return id; } public void setid(int id){this.id = id; } //名前プライベート文字列名; public string getName(){return name; } public void setName(string name){this.name = name; } //コレクションプライベートセットセットバリューを設定します。 public set getSetValues(){return setValues; } public void setSetValues(set setValues){this.setValues = setValues; } //リストコレクションプライベートリスト値の値。 public List getListValues(){return listvalues; } public void setListValues(list listvalues){this.listvalues = listvalues; } //配列コレクションプライベート文字列[] ArrayValues; public string [] getArrayValues(){return arrayvalues; } public void setArrayValues(string [] arrayvalues){this.arrayvalues = arrayvalues; } //マップコレクションプライベートマップマップバリュー。 public Map getMapValues(){return MapValues; } public void setMapValues(Map MapValues){this.mapvalues = mapValues; }}このクラスは、いくつかの一般的に使用されるセットをカプセル化します。それらをリレーショナルモデルに変換する場合は、以下のマッピングを確認する必要があります。
4。コレクションマッピング
コレクションのマッピングは実際には非常に簡単です。対応するコレクションタグを追加するだけです。 hibernateは、それぞれコレクションタグ<set>、<map>、<list>、<array>を提供します。コレクションは、集中タグを使用して対応する関係テーブルにマッピングされます。さらに、<key>タグを追加することにより、外国キーの関連付けが達成され、<要素>を使用して他の属性が追加されます。
CollectionMapping.hbm.xml
<?xml version = "1.0"?> <!doctype hibernate-mapping public " - // hibernate/hibernateマッピングDTD 3.0 // en" "http://hibernate.sourceforge.net/hibernate-mapting-3.0.dtd">表= "t_collection_mapping"> <id name = "id"> <generator // id> <プロパティ名= "name"/> <set name = "setValues" table = "t_set_values"> <key column = "set_id"> </key> <要素タイプ= "文字列" column = "set_value"> < column = "list_id"/> <list-index column = "list_index"/> <要素タイプ= "文字列" column = "list_value"/> </list> <map = "mapvalues" table = "t_map_values"> <key column = "map_id"/>> <map-key type = "column ="/> <element "colum" <array name = "arrayvalues" table = "t_array_value"> <key column = "array_id"/> <index column = "array_index" "type ="> </index> <element type = "string" column = "array_value"/> </array> </class> </highbernate-mapping> </
リストタグと配列タグに注意する必要があります。これら2つのセットのオブジェクトは順調です。したがって、マッピングタグを追加するときは、リストインデックスまたはインデックスタグを使用してオブジェクトの順序を示す必要があります。さらに、サブタグを追加するときは、それらを順番に追加する必要があります。つまり、最初に<key>タグを追加してから、<list-index>タグを追加し、最後に<要素>タグを追加します。そうしないと、次のエラーが表示されます。
The content of element type "list" must match "(meta*,subselect?,cache?,synchronize*,comment?,key,(index|list-index),(element|one-to-many|many-to-many|composite-element|many-to-any),loader?,sql-insert?,sql-update?,sql-delete?,sql-delete-all?,filter*)".
5。リレーショナルモデル
構成されたオブジェクトモデルは、対応するリレーショナルモデルに変換され、生成されたSQLステートメントは次のとおりです。
テーブルT_ARRAY_VALUE DROP外部キーFK2E0DD0C067676B68変更テーブルT_LIST_VALUESドロップ外部キーFKE01EC98BF4FCB03 ALTER TABLE TABLE TABLE TABLE TABLE TABLE TABLE TABLE TABLE TABLE TABLE TABLE TEABL存在するt_array_valueドロップテーブル存在する場合はt_collection_mappingドロップテーブル存在する場合はt_list_valuesドロップテーブル存在する場合はt_map_valuesドロップテーブルを作成しますt_set_values Create t_array_value(array_id integer not Null、array_value varchar(255)、array_index integer_id、array_id、array_index integer_id、array_indexテーブルT_COLLECTION_MAPPING(null null auto_increment、name varchar(255)、primary key(id))Create t_list_value varchar(255)、list_index integer、list_id、list_index)) null、primary key(map_id、map_key))を作成するテーブルt_set_values(set_id integer not null、set_value varchar(255))を変更するテーブルt_array_value add index fk2e0dd0c06767676b68(array_id)、constrain T_COLLECTION_MAPPING(ID)ALTER TABLE T_LIST_VALUES ADD INDEX FKE01EC98BF4FCB03(list_id)、制約fke01ec98bf4fcb03外部キー(list_id)参考文献T_collection_mapping(id)alter table t_values add fkd169ba107402b585( FKD169BA107402B585外部キー(MAP_ID)参照T_COLLECTION_MAPPINESS(ID)ALTER TABLE T_SET_VALUES ADD INDEX FK7B8D04A7E79F8BF(SET_ID)、追加Constraint FK7BB8D04A7E79F8BF FOREIDEM KEY(SET_ID)参照T_ID)
生成された対応するデータベースビューは次のとおりです。
2。データ操作
1。データライティング
データ操作を作成するときは、データを作成するときにデータオブジェクトの作成に注意する必要があります。リスト、設定、およびマップは、データオブジェクトを作成し、データベースにデータオブジェクトを書き込む必要があります。それらの3つはすべてオブジェクトインターフェイスであるため、オブジェクトを作成してデータベースにオブジェクトを書き込む必要があります。特定のコードは次のとおりです。
@suppresswarnings({"unchecked"、 "rawTypes"})public void testsave(){session session = null; try {session = hibernateutils.getSession(); session.begintransaction(); collectionmapping cm = new CollectionMapping(); cm.setName( "Zhangsan"); set set = new Hashset(); set.add( "a"); set.add( "b"); cm.SetSetValues(set);リストリスト= new arrayList(); list.add( "list1"); list.add( "list2"); cm.setListValues(list); string [] str = new String [] {"array1"、 "array2"}; cm.SetArrayValues(str);マップマップ= new Hashmap(); map.put( "k1"、 "v1"); map.put( "k2"、 "v2"); cm.SetMapValues(MAP); session.save(cm); session.getTransaction()。commive(); } catch(Exception e){e.printstacktrace(); session.getTransaction()。rollback(); }最後に{hibernateutils.closessession(session); }}生成されたSQLステートメントは次のとおりです。
hibernate:t_collection_mapping(name)values(?)hibernate:t_set_values(set_id、set_value)values(?、?)hibernateに挿入:t_set_values(set_value)values(?、?)hibernate:insit hibernate:t_list_valuesに挿入(list_id、list_index、list_value)values(?、?、?)hibernate:t_list_values(list_id、list_index、list_value)値(?、?、?)hibernate:hibernate:t_list_valueに挿入(? t_map_values(map_id、map_key、map_value)values(?、?、?)hibernate:t_map_valuesに挿入(map_id、map_key、map_value)values(?、?)hibernate:hibernate:t_array_value(array_id、array_index、insert intering(? t_array_value(array_id、array_index、array_value)values(?、?、?)
2。データの読み込み
データを読み込む方法は非常に簡単です。セットに従ってテーブルのデータをオブジェクトにロードし、対応するオブジェクトコレクションを取得するだけです。
public void testload(){session session = null; try {session = hibernateutils.getSession(); session.begintransaction(); collectionmapping cm =(collectionmapping)session.load(collectionmapping.class、1); System.out.println( "cm.name ="+cm.getName()); System.out.println( "cm.list ="+cm.getListValues()); system.out.println( "cm.map ="+cm.getMapValues()); system.out.println( "cm.array ="+cm.getArrayValues()); system.out.println( "cm.set ="+cmetsetValues()); session.getTransaction()。commive(); } catch(Exception e){e.printstacktrace(); session.getTransaction()。rollback(); }最後に{hibernateutils.closessession(session); }}生成された結果:
hibernate:select collection0_.idはid0_0_、collection0.name as name0_0_からt_collection_mapping collection0_ where collection0_.id =? hibernate:ArrayValue0_.array_idはarray1_0_、arrayvalue0_.array_valueとしてarray2_0_、arrayvalue0_.array_indexとしてt_array_value arrayvalue0_ asrayvalue0_.array_id =? cm.name = Zhangsan hibernate:select listvalues0_.list_id as list1_0_、listvalues0_.list_value as list2_0_、listvalues0_.list_index as list3_0_ cm.list = [list1、list2] hibernate:mapvalues0_.map_idをmap1_0_、mapvalues0_.map_value as map2_0_、mapvalues0_.may as map3_0_ from t_map_values mapvalues0_ここでmap_id =? cm.map = {k1 = v1、k2 = v2} cm.array = [ljava.lang.string;@758d8478 hibernate:select setvalues0_.set_id as set1_0_、setvalues0_.set_value as set2_0_ cm.set = [b、a] 3。概要
Hibernateは、java.util.map、java.util.set、java.util.sortedmap、java.util.sortedset、java.util.list、および任意の持続的なエンティティまたは値の配列(セットコレクションタイプを使用)など、次のJavaコレクションのインスタンスを持続できます。型java.util.collectionまたはjava.util.listのプロパティも、「バッグ」セマンティクスを使用して持続できます。永続性に使用されるコレクションは、コレクションインターフェイスを除くこれらのインターフェイスを実装するクラスに添付されたセマンティクスを保持できません(たとえば、LinkedHashsetによってもたらされる反復順序)。すべての永続的なコレクションは、実際には、ハッシュマップ、ハッシュセット、ツリーマップ、ツリーセット、アレイリストのセマンティクスに従って直接機能します。より深く言うと、コレクションを含むプロパティの場合、Javaタイプはインターフェイス(つまり、マップ、セット、またはリストなど)として定義する必要があり、ハッシュマップ、ツリーセット、またはアレイリストであってはなりません。この制限の理由は、わからない場合は、マップ、セット、リストのインスタンスを独自の実装、セット、またはリストに密かに交換し、マップを密かに交換します。 (したがって、プログラムでは、==オペレーターを慎重に使用してください。)(注:パフォーマンスやその他の理由については、ほぼすべてのJavaコレクションインターフェイスが冬眠(怠loadingのいくつかの機能を実装するため)に実装されます。)すべての順序付けられたコレクションクラス(マップ、リスト、配列)には、<キー>と<インデックス>の主要なキーがあります。この場合、コレクションクラスの更新は非常に効率的です - 主キーは効果的にインデックス化されているため、Hibernateが行を更新または削除しようとすると、その行のデータは迅速に見つかります。セット(セット)の主キーは、<キー>およびその他の要素フィールドで構成されています。これは、一部の要素タイプ、特に組み合わせ要素、大きなテキスト、または大きなバイナリフィールドでは非効率的です。データベースは、複雑なプライマリキーを効果的にインデックスに導くことができない場合があります。一方、1対多くの、多目的な関連性、特に合成識別子の場合、セットは同じ効率的なパフォーマンスを達成できます。 (パート1:schemaexportが<set>の主要なキーを作成したい場合は、すべてのフィールドをnot-null = "true"と宣言する必要があります。)<idbag>マップはプロキシキーを定義しているため、いつでも効率的に更新できます。実際、<idbag>は最高のパフォーマンスを持っています。バッグは最悪です。バッグは要素値を重複させ、インデックスフィールドがないため、プライマリキーを定義することは不可能です。冬眠は重複した線を決定できません。そのようなコレクションが変更されると、Hibernateは最初にコレクション全体(単一の削除を介して)を完全に削除し、次にコレクション全体を再作成します。したがって、バッグは非常に非効率的です。