1. Pemetaan Koleksi
1. PENDAHULUAN KOLEKSI
Pemetaan pengumpulan juga merupakan pemetaan dasar, tetapi tidak akan sering digunakan selama proses pengembangan, sehingga tidak perlu memiliki pemahaman yang mendalam. Anda hanya perlu memahami metode penggunaan dasar. Hanya dapat meminta solusi ketika Anda mengalami masalah seperti itu selama proses pengembangan. Pemetaan set yang sesuai pada kenyataannya, itu mengacu pada pemetaan set di java ke tabel yang sesuai. Ini adalah pemetaan objek koleksi. Ada empat jenis set di java, yaitu set, peta, daftar dan array biasa. Ada perbedaan besar di antara mereka:
(1) Set, seharusnya tidak ada objek duplikat, objek tidak teratur;
(2) Daftar dapat dipesan dengan objek berulang;
(3) peta, muncul pada pasangan nilai -nilai kunci;
(4) Array dapat diulang, dan ada urutan antar objek.
Perbedaan di antara mereka menentukan koleksi mana yang digunakan selama pengembangan. Biasanya, set digunakan selama pengembangan. Objek di dalamnya tidak perlu dan objek internal dapat diperoleh dengan menggunakan iterator. Jika set ini ingin memetakan ke model relasional yang sesuai, Anda harus menggunakan tag pemetaan yang disediakan oleh Hibernate, <Set>, <list>, <peta>, dan <rrray>.
2. Pendahuluan Pemetaan
Terus membahas model hubungan pemetaan set. Atur pemetaan mengacu pada objek yang sesuai dengan koleksi objek lain. Saat menyimpan, Hibernate akan menyimpan set data ke tabel yang sesuai dan menyimpan data ke tabel data sesuai dengan ID yang dialokasikan. Jika tabel baru ditetapkan ke set secara terpisah, ID akan ditugaskan ke ID tabel yang ditetapkan, dan tabel hubungan yang sesuai adalah sebagai berikut:
3. File kelas
Bagaimana Set Pemetaan Diimplementasikan Melalui Kode, dan kami akan menganalisisnya secara rinci selanjutnya. Di sini kami menyegel semua koleksi ke dalam kelas. Kami menyebut kelas ini collectionmapping.java, jadi kode internalnya yang sesuai adalah sebagai berikut:
paket com.hibernate; impor java.util.list; impor java.util.map; impor java.util.set; @SuppressWarnings ("RawTypes") Public Classmapping Collection {// ID Private InT ID; publik int getId () {return id; } public void setid (int id) {this.id = id; } // Nama nama string pribadi; public string getName () {return name; } public void setName (name string) {this.name = name; } // set koleksi set private setValues; set publik getSetValues () {return setValues; } public void setSetValues (set setValues) {this.setValues = setValues; } // Daftar Koleksi Private List ListValues; daftar publik getListValues () {return listValues; } public void setListValues (Daftar ListValues) {this.listValues = ListValues; } // Array Collection Private String [] ArrayValues; string publik [] getArrayValues () {return arrayValues; } public void setArrayValues (string [] arrayValues) {this.arrayValues = arrayValues; } // peta koleksi private mapValues peta; peta publik getMapValues () {return mapValues; } public void setMapValues (peta mapValues) {this.mapValues = MapValues; }}Kelas ini merangkum beberapa set yang umum digunakan. Jika Anda ingin mengubahnya menjadi model relasional, Anda harus melihat pemetaan di bawah ini.
4. Pemetaan Koleksi
Pemetaan koleksi sebenarnya cukup sederhana. Anda hanya perlu menambahkan tag koleksi yang sesuai. Hibernate menyediakan tag koleksi <Set>, <peta>, <list>, dan <r array> masing -masing. Koleksi dipetakan ke dalam tabel hubungan yang sesuai dengan menggunakan tag terpusat. Selain itu, asosiasi kunci asing dicapai dengan menambahkan tag <yyy>, dan atribut lainnya ditambahkan dengan menggunakan <sement>.
CollectionMapping.hbm.xml
<? XML Versi = "1.0"?> <! Doctype hibernate-mapping public "-// hibernate/hibernate pemetaan dtd 3.0 // en" "http://hibernate.sourceForge.net/hibernate-papping-3.0.dtd"> <hibernate-papping> <clip clip = "coming. table="t_collection_mapping"> <id name="id"> <generator//id> <property name="name"/> <set name="setValues" table="t_set_values"> <key column="set_id"></key> <element type="string" column="set_value"></element> </set> <list name="listValues" table="t_list_values"> <key column="list_id"/> <list-index column="list_index"/> <element type="string" column="list_value"/> </list> <map name="mapValues" table="t_map_values"> <key column="map_id"/> <map-key type="string" column="map_key"/> <element type="string" column="map_value"/> </map> <array name="arrayValues" table="t_array_value"> <key column="array_id"/> <index column="array_index" type="integer"></index> <element type="string" column="array_value"/> </array> </class> </hibernate-mapping>
Perlu dicatat bahwa tag daftar dan tag array. Objek dalam dua set ini beres. Oleh karena itu, saat menambahkan tag pemetaan, Anda perlu menggunakan daftar indeks-indeks atau indeks untuk menunjukkan urutan objek. Selain itu, saat menambahkan sub-tag, Anda harus menambahkannya secara berurutan. Artinya, pertama-tama tambahkan tag <yyy>, lalu tambahkan tag <list-Index>, dan akhirnya tambahkan tag <sement>, jika tidak kesalahan berikut akan muncul:
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. Model Relasional
Model objek yang dikonfigurasi dikonversi menjadi model relasional yang sesuai, dan pernyataan SQL yang dihasilkan adalah sebagai berikut:
ubah tabel t_array_value drop kunci asing fk2e0dd0c067676b68 ubah tabel t_list_values drop kunci asing fke01ec98bf4fcb03 ubah tabel t_map_values drop asing fkd169ba1074402b585 tabel t_ -values fkd169ba107440b585 tabel t_set_val fkd169ba107440b585 tabel t_set_val fkd169ba107440b585 tabel t_set _set_val fkd169ba107440B585 Fk7bb8d04a7e79f8bf tabel drop jika ada t_array_value tabel drop jika ada t_collection_mapping tabel drop jika ada t_list_values tabel drop jika ada t_map_values tabel drop jika ada no no -no -no -values tabel t_ray_value (array a no no no no -valu array_index integer not null, primary key (array_id, array_index)) create table t_collection_mapping (id integer not null auto_increment, name varchar(255), primary key (id)) create table t_list_value varchar(255), list_index integer not null, primary key (list_id, list_index)) create table t_map_values (Peta_id integer bukan nol, map_value varchar (255), map_key varchar (255) bukan null, kunci primer (peta_id, peta_key)) Buat tabel t_set_values (set_id integer bukan null, set_value varchar (255)) ubah tabel t_array_value addray fk2e (255)) ubah tabel t_array_value fk2e), fk2e6 Batasan FK2E0DD0C067676B68 Kunci Asing (Array_ID) Referensi t_collection_mapping (ID) ubah tabel t_list_values Tambahkan indeks fke01ec98bf4fcb03 (list_id), tambahkan kendala fke01ec98bf4fcb03 (list_id), constract fkeatt fke01ec98bf4fcb03) alibpeksi (list_id), Constract FKE01EC98BF4FCB03 (list_id), Constraint FKE01EC98BF4FCB03 KEFORTER (LIST_ID), CONSTROBSE) T_MAP_VALUES Tambahkan indeks FKD169BA107402B585 (MAP_ID), tambahkan kendala FKD169BA107402B585 Kunci Asing (MAP_ID) Referensi T_Collection_Mapping (ID) ALTER TAING T_SET_VALUES Tambahkan indeks FK7BBB8D04E7 (ID) Tabel T_SET_VALUES (TAING8BALUES (ID) TAID (ID) TAID1 Fk7bb8d04a7e79f8bf kunci asing (set_id) referensi t_collection_mapping (id)
Tampilan database yang sesuai yang dihasilkan adalah sebagai berikut:
2. Operasi Data
1. Menulis data
Saat menulis operasi data, Anda perlu memperhatikan membuat objek data saat menulis data. Daftar, set, dan peta perlu membuat objek data dan menulis objek data ke database. Karena ketiganya adalah antarmuka objek, Anda perlu membuat objek dan menulis objek ke database. Kode spesifiknya adalah sebagai berikut:
@SuppressWarnings ({"Uncecked", "RawTypes"}) public void testSave () {session session = null; coba {session = hibernateutils.getSession (); session.begintransaction (); CollectionMapping CM = CollectionMapping baru (); cm.setname ("zhangsan"); Set set = hashset baru (); set.add ("a"); set.add ("b"); cm.setsetValues (set); Daftar Daftar = ArrayList baru (); list.add ("list1"); list.add ("list2"); CM.SetListValues (Daftar); String [] str = string baru [] {"array1", "array2"}; CM.SetArrayValues (STR); Peta peta = hashmap baru (); peta.put ("k1", "v1"); peta.put ("k2", "v2"); cm.setMapValues (peta); session.save (cm); session.getTransaction (). Commit (); } catch (Exception e) {E.PrintStackTrace (); session.getTransaction (). rollback (); } akhirnya {hibernateutils.closesession (sesi); }}Pernyataan SQL yang dihasilkan adalah sebagai berikut:
Hibernate: masukkan ke dalam t_collection_mapping (name) values (?) Hibernate: masukkan ke dalam t_set_values (set_id, set_value) nilai (?,?) Hibernate: masukkan ke dalam nilai t_set_values (set_id, set_value) (?, (?,?,?) Hibernate: masukkan ke dalam nilai t_list_values (list_id, list_index, list_value) nilai (?,?,?) Hibernate: masukkan ke dalam nilai t_list_values (list_id, list_index, list_value) nilai (?, ?,?) Hibernate: Insert in Into, List_Value) (? (?,?,?) Hibernate: masukkan ke dalam nilai t_map_values (MAP_ID, MAP_KEY, MAP_VALUE) (?,?,?) Hibernate: masukkan ke dalam nilai T_MAP_VALUES (MAP_ID, MAP_KEY, MAP_VALUE (? (?,?,?) Hibernate: masukkan ke dalam t_array_value (array_id, array_index, array_value) nilai (?,?,?)
2. Memuat data
Metode memuat data sangat sederhana. Ini akan memuat data dalam tabel ke dalam objek sesuai dengan set, dan kemudian Anda hanya perlu mendapatkan pengumpulan objek yang sesuai.
public void testLoad () {session session = null; coba {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 ="+cm.getSetValues ()); session.getTransaction (). Commit (); } catch (Exception e) {E.PrintStackTrace (); session.getTransaction (). rollback (); } akhirnya {hibernateutils.closesession (sesi); }}Hasilnya dihasilkan:
Hibernate: Pilih collection0_.id sebagai id0_0_, collection0_.name as name0_0_ dari t_collection_mapping collection0_ di mana collection0_.id =? Hibernate: Pilih ArrayValue0_.Array_id sebagai array1_0_, arrayValue0_.array_value sebagai array2_0_, arrayValue0_.array_index sebagai array3_0_ dari t_array_value arrayValue0_ di mana arrayvalue0_.array_id = value0_ di mana arrayvalue0_.array_id = value0? cm.name = zhangsan hibernate: pilih listValues0_.list_id sebagai list1_0_, listValues0_.list_value sebagai list2_0_, listValues0_.list_index sebagai list3_0_ dari t_list_values listValues0_ di mana listValues0_. cm.list = [list1, list2] hibernate: pilih mapValues0_.map_id sebagai MAP1_0_, MAPVALUES0_.MAP_VALUE AS MAP2_0_, MAPVALUES0_.MAP_KEY AS MAP3_0_ dari t_map_values MapValues0_ di mana Map3_0_ dari t_map_values MapValues0_ di mana Map3_0_ dari t_map_values mapValues0_ di mana Map3_0_ dari MapValues0_. CM.Array = [ljava.lang.string;@758d8478 hibernate: pilih setValues0_.set_id sebagai set1_0_, setValues0_.set_value sebagai set2_0_ dari t_set_values0_. cm.set = [b, a]
3. Ringkasan
Hibernate dapat mempertahankan contoh koleksi Java berikut, termasuk java.util.map, java.util.set, java.util.sortedmap, java.util.sortedset, java.util.list, dan array dari entitas atau nilai yang persisten (menggunakan jenis koleksi yang ditetapkan adalah pilihan terbaik). Sifat tipe java.util.collection atau java.util.list juga dapat bertahan menggunakan semantik "tas". Koleksi yang digunakan untuk kegigihan tidak dapat mempertahankan semantik yang melekat pada kelas apa pun yang mengimplementasikan antarmuka ini kecuali untuk antarmuka koleksi (misalnya: urutan iteratif yang dibawa oleh LinkedHashset). Semua koleksi persisten sebenarnya bekerja langsung sesuai dengan semantik hashmap, hashset, treemap, treeset dan arraylist. Singkatnya, untuk properti yang berisi koleksi, tipe Java harus didefinisikan sebagai antarmuka (yaitu, peta, set, atau daftar, dll.), Dan tidak boleh hashmap, treeset atau arraylist. Alasan untuk batasan ini adalah bahwa ketika Anda tidak tahu, Hibernate diam -diam menggantikan peta Anda, mengatur dan daftar instance dengan implementasi peta, set atau daftarnya sendiri. ; Dalam hal ini, pembaruan kelas pengumpulan sangat efisien - kunci utama telah diindeks secara efektif, jadi ketika Hibernate mencoba memperbarui atau menghapus baris, data baris itu dapat ditemukan dengan cepat. Kunci utama dari set (set) terdiri dari <yyy> dan bidang elemen lainnya. Ini tidak efisien untuk beberapa jenis elemen, terutama elemen kombinasi atau teks besar atau bidang biner besar; Basis data mungkin tidak dapat secara efektif mengindeks kunci primer kompleks. Di sisi lain, untuk satu-ke-banyak, banyak asosiasi, terutama pengidentifikasi sintetis, set dapat mencapai kinerja efisien yang sama. (Bagian 1: Jika Anda ingin SchemaExport membuat kunci utama untuk <Set> Anda, Anda harus menyatakan semua bidang sebagai not-null = "true".) Peta <dbag> mendefinisikan kunci proxy, sehingga selalu dapat diperbarui secara efisien. Faktanya, <dbag> memiliki kinerja terbaik. Tas adalah yang terburuk. Karena tas memungkinkan nilai elemen duplikat dan tidak memiliki bidang indeks, tidak mungkin untuk mendefinisikan kunci primer. Hibernate tidak dapat menentukan garis duplikat. Ketika koleksi seperti itu diubah, hibernate pertama -tama akan menghapus seluruh koleksi (melalui satu penghapusan) dan kemudian menciptakan kembali seluruh koleksi. Oleh karena itu tas sangat tidak efisien.