เวลานี้มาพูดคุยเกี่ยวกับการออกแบบลำดับชั้นของ Hibernate ซึ่งเป็นการออกแบบความสัมพันธ์ที่สืบทอดระหว่างหน่วยงาน
บางทีนี่อาจเป็นนามธรรมมากขึ้นลองดูตัวอย่างโดยตรง
1) ก่อนอื่นให้ดูที่การปฏิบัติทั่วไปและป้อนรหัสโดยตรง: สามคลาสจริงมีดังนี้:
Titem คลาสสาธารณะใช้ serializable {// omit get/set method method id private int id; การผลิตสตริงส่วนตัว ชื่อสตริงส่วนตัว; } คลาสสาธารณะ tbook ขยาย titem {// omit get/set วิธีการส่วนตัว int pagecount; } คลาสสาธารณะ TDVD ขยาย titem {// omit get/set วิธีการส่วนตัวสตริง private regionCode; -
ที่นี่เราต้องการไฟล์การแมปสามไฟล์เนื้อหามีดังนี้:
<class name = "titem" table = "item"> <id name = "id" คอลัมน์ = "id" type = "java.lang.integer"> <generator/> </id> <name property = "name" คอลัมน์ = "name" type = "java.lang.string"/> table = "book"> <id name = "id" คอลัมน์ = "id" type = "java.lang.integer"> <generator/> </id> <property name = "name" คอลัมน์ = "name" type = "java.lang.string"/> <property name = "column" property " type = "java.lang.integer"/> </class> <class name = "tdvd" table = "dvd"> <id name = "id" คอลัมน์ = "id" type = "java.lang.integer"> <generator/> </id> type = "java.lang.string"/> <property name = "regionCode" คอลัมน์ = "regionCode" type = "java.lang.string"/> </class>
ไฟล์การแมปธรรมดามากไม่มีความแตกต่างจากไฟล์ก่อนหน้า
มาเขียนวิธีทดสอบโดยตรง:
Public Void TestSelect () {Query Query = session.createquery ("จาก Titem"); รายการรายการ = query.list (); Iterator iter = list.iterator (); ในขณะที่ (iter.hasnext ()) {system.out.println ("ชื่อ:"+((((titem) iter.next ()). getName ()));}} โปรดทราบว่าที่นี่เรากำลังใช้คลาส Titem ไม่ใช่คลาส Word เฉพาะ ที่นี่มันจะมองหาคลาสย่อยที่สืบทอดมาจากคลาส Titem และค้นหาผลลัพธ์ทั้งหมดโดยอัตโนมัติ สิ่งนี้เกี่ยวข้องกับความหลากหลาย แท็กคลาสมี polymorphism คุณสมบัติและค่าเริ่มต้นนั้นเป็นนัยซึ่งหมายความว่าผลลัพธ์สามารถสอบถามได้โดยไม่ต้องระบุชื่อ หากมีความชัดเจนหมายความว่าคุณต้องระบุชื่อคลาสเฉพาะก่อนที่คุณจะสามารถค้นหาผลลัพธ์ของประเภทนี้
2) ในตัวอย่างก่อนหน้านี้เราใช้ไฟล์การแมปสามไฟล์ เมื่อเราต้องการแก้ไขเราจำเป็นต้องแก้ไขไฟล์การแมปสามไฟล์ซึ่งไม่สามารถทำได้สำหรับโครงการขนาดใหญ่ ยิ่งไปกว่านั้นแต่ละตารางมีฟิลด์ที่สอดคล้องกันสำหรับคลาสหลักที่สอดคล้องกันซึ่งซ้ำซ้อน ดังนั้นเราจึงมีวิธีการต่อไปนี้
คลาสเอนทิตียังคงเหมือนกับใน 1) เราเปลี่ยนไฟล์การแมปจากสามเป็นหนึ่งและเก็บไฟล์การแมป Titem เท่านั้น แต่เราจำเป็นต้องทำการปรับเปลี่ยนที่สอดคล้องกันและเนื้อหามีดังนี้:
<class name = "titem" table = "item" polymorphism = "ชัดเจน"> <id name = "id" คอลัมน์ = "id" type = "java.lang.integer"> <generator/> </id> <property name = "name" column = "name" type = "java.lang.string"/> <เข้าร่วม-subclass name = "tbook" table = "tbook"> <คีย์คอลัมน์ = "id" /> <property name = "pagecount" คอลัมน์ = "pagecount" type = "java.lang.integer" /> </onin-subclass> column = "regionCode" type = "java.lang.string"/> </oninined-subclass> </class>
ที่นี่เรามีไฟล์การแมปเท่านั้น แต่มีแท็กที่เข้าร่วม Subclass ซึ่งระบุว่าคลาสนี้สืบทอดมาจากคลาสปัจจุบัน <sey> ระบุคีย์หลักของตารางย่อย ที่นี่ตารางย่อยหมายถึงสองตารางที่สอดคล้องกับคลาสย่อย TBOOK และ TDVD เฉพาะฟิลด์ใน Subtable เท่านั้นที่ระบุไว้ในคุณสมบัติ
ด้วยวิธีนี้ตารางที่สร้างขึ้นหลังจากที่เราเรียกใช้มีดังนี้:
ตารางที่สอดคล้องกับคลาสย่อยทั้งสองเป็นเพียงฟิลด์ที่เราระบุผ่านคุณสมบัติ สิ่งนี้จะหลีกเลี่ยงหลายฟิลด์ในตารางเพื่อให้ตารางคำจะรักษาฟิลด์แยกต่างหากเท่านั้น เมื่อคลาสรายการเปลี่ยนแปลงไม่จำเป็นต้องทำการแก้ไขมากเกินไป
3) มาเรียนรู้เกี่ยวกับวิธีอื่นในการใช้การออกแบบลำดับชั้นซึ่งทำได้โดยการวางธงไว้ในตาราง ในไฟล์การแมปไฮเบอร์เนตเราใช้งานผ่านแท็ก descriminator
โดยไม่ต้องกังวลใจเพิ่มเติมลองมาดูตัวอย่าง:
เราแก้ไขไฟล์การแมปของ Titem เมื่อวานนี้เป็น:
<class name = "titem" table = "item" polymorphism = "ชัดเจน"> <id name = "id" คอลัมน์ = "id" type = "java.lang.integer"> <generator/> </id> <discriminator column = "category" type = "java.lang.string"/> name = "Manufacture" คอลัมน์ = "Manufacture" type = "java.lang.string"/> </class>
เมื่อเห็นตรงกลางเราได้เพิ่มแท็ก discriminator ซึ่งแสดงให้เห็นว่าสนามย่อยสองคลาสของเรามีความโดดเด่น
<subclass name = "tbook" discriminator-value = "1"> <property name = "pagecount" คอลัมน์ = "pagecount"/> </subclass> <subclass name = "tdvd" discriminator-value = "2">
เราเห็นทั้งสองย่อหน้านี้ซึ่งบ่งชี้ว่าเมื่อค่าของฟิลด์ที่ระบุโดย discriminator คือ 1 มันบ่งชี้ว่ามันเป็นคลาส TBOOK และ Pagecount มีค่า เมื่อค่าของฟิลด์ที่ระบุโดย discriminator คือ 2 แสดงว่าเป็นคลาส TDVD และรหัสภูมิภาคมีค่า
ด้วยวิธีนี้เราต้องใช้ตารางเดียวเท่านั้นซึ่งบ่งบอกถึงความสัมพันธ์ระหว่างพวกเขากับหลายชั้นเรียน โปรดทราบว่าวิธีนี้ไม่ดีสำหรับคลาสย่อยมากเกินไป มันจะทำให้ฟิลด์มากเกินไปในตารางหลักและทำให้เกิดความไม่สะดวกในการออกแบบ