ชุด
ชุดคอลเลกชันเป็นคอลเลกชัน Java ที่ไม่มีองค์ประกอบที่ซ้ำกัน Set อย่างเป็นทางการมากขึ้นไม่มีองค์ประกอบใด ๆ ใน E1 และ E2 เช่น E1.equals (E2) และองค์ประกอบที่ว่างเปล่าส่วนใหญ่ ดังนั้นการถูกเพิ่มเข้าไปในชุดของวัตถุจะต้องใช้วิธี Equals () และ HashCode () เพื่อให้ Java สามารถกำหนดได้ว่าองค์ประกอบ/วัตถุใดที่สองเท่ากันหรือไม่
ชุดถูกแมปกับองค์ประกอบ <Set> ในตารางแผนที่และเริ่มต้นใน java.util.hashset คุณสามารถใช้คอลเลกชันชุดเพื่อมีองค์ประกอบในคอลเลกชันที่ไม่จำเป็นต้องทำซ้ำเมื่อใช้คลาส
กำหนดตาราง RDBMS:
พิจารณากรณีที่เราต้องการบันทึกพนักงานของเราที่จะเก็บไว้ในตารางพนักงานโดยมีโครงสร้างต่อไปนี้:
สร้างพนักงานตาราง (ID int ไม่ใช่ null auto_increment, first_name varchar (20) ค่าเริ่มต้น null, last_name varchar (20) ค่าเริ่มต้น null, เงินเดือน int เริ่มต้น null, คีย์หลัก (id));
นอกจากนี้ยังสันนิษฐานว่าพนักงานแต่ละคนสามารถมีใบรับรองหนึ่งใบหรือมากกว่าที่เกี่ยวข้องกับเขา/เธอ ดังนั้นเราจึงจัดเก็บข้อมูลที่เกี่ยวข้องของใบรับรองในตารางแยกต่างหากพร้อมโครงสร้างต่อไปนี้:
สร้างใบรับรองตาราง (ID int ไม่ใช่ null auto_increment, certificate_name varchar (30) ค่าเริ่มต้น null, Employee_id int เริ่มต้น null, คีย์หลัก (ID));
จะมีความสัมพันธ์ระหว่างพนักงานจำนวนมากและวัตถุใบรับรอง:
กำหนดคลาส Pojo:
ลองใช้พนักงานระดับ POJO ของเราจะถูกนำมาใช้เพื่อเก็บรวบรวมวัตถุในตารางพนักงานและตัวแปรชุดที่ได้รับการรับรอง
นำเข้า java.util.*; พนักงานชั้นเรียนสาธารณะ {ID INT ส่วนตัว; สตริงส่วนตัวชื่อแรก; สตริงส่วนตัวนามสกุล; เงินเดือนส่วนตัว ใบรับรองชุดส่วนตัว พนักงานสาธารณะ () {} พนักงานสาธารณะ (สตริง fname, สตริง lname, เงินเดือน int) {this.firstname = fname; this.lastName = lName; this.salary = เงินเดือน; } สาธารณะ int getId () {return id; } โมฆะสาธารณะ setId (int id) {this.id = id; } สตริงสาธารณะ getFirstName () {return firstName; } โมฆะสาธารณะ setFirstName (สตริง first_name) {this.firstName = first_name; } สตริงสาธารณะ getLaStName () {return lastName; } โมฆะสาธารณะ setLastName (สตริง last_name) {this.lastName = last_name; } public int getalary () {คืนเงินเดือน; } โมฆะสาธารณะ setSalary (เงินเดือน int) {this.salary = เงินเดือน; } ชุดสาธารณะ getCertificates () {ใบรับรองการส่งคืน; } โมฆะสาธารณะ setCertificates (ชุดใบรับรอง) {this.certificates = ใบรับรอง; - ตอนนี้เรามากำหนดใบรับรองของคลาส POJO อื่นที่สอดคล้องกับตารางวัตถุใบรับรองดังกล่าวสามารถจัดเก็บและดึงตารางใบรับรอง คลาสนี้ควรใช้วิธี Equals () และ HashCode () ในเวลาเดียวกันเพื่อให้ Java สามารถกำหนดได้ว่าองค์ประกอบ/วัตถุใดที่เหมือนกันหรือไม่
ใบรับรองชั้นเรียนสาธารณะ {ID INT ส่วนตัว; ชื่อสตริงส่วนตัว; ใบรับรองสาธารณะ () {} ใบรับรองสาธารณะ (ชื่อสตริง) {this.name = name; } สาธารณะ int getId () {return id; } โมฆะสาธารณะ setId (int id) {this.id = id; } สตริงสาธารณะ getName () {ชื่อคืน; } โมฆะสาธารณะ setName (ชื่อสตริง) {this.name = name; } บูลีนสาธารณะเท่ากับ (object obj) {ถ้า (obj == null) ส่งคืนเท็จ; if (! this.getClass (). เท่ากับ (obj.getClass ())) ส่งคืนเท็จ; ใบรับรอง OBJ2 = (ใบรับรอง) OBJ; if ((this.id == obj2.getId ()) && (this.name.equals (obj2.getName ()))) {return true; } return false; } public int hashCode () {int tmp = 0; tmp = (id + ชื่อ) .hashCode (); กลับ TMP; - กำหนดไฟล์การแมปไฮเบอร์เนต:
ลองพัฒนาไฟล์การแมปที่ระบุว่า Hibernate กำหนดไฟล์การแมปที่แมปกับตารางฐานข้อมูลอย่างไร องค์ประกอบ <et> จะถูกใช้เพื่อกำหนดกฎที่ใช้ในการตั้งค่าการรวบรวม
<? XML เวอร์ชัน = "1.0" การเข้ารหัส = "UTF-8"?> <! Doctype Hibernate-Mapping สาธารณะ "-// hibernate/hibernate mapping dtd // en" "http://www.hibernate.org/dtd/hibernate-mapping-3 table = "พนักงาน"> <meta attribute = "Class-Description"> คลาสนี้มีรายละเอียดของพนักงาน </meta> <id name = "id" type = "int" คอลัมน์ = "id"> <generator/> </id> <set name = "ใบรับรอง" cascade = "all"> <key column = "Employee_id"/> <one-to-merany/> </et> type = "string"/> <property name = "salary" คอลัมน์ = "เงินเดือน" type = "int"/> </class> <class name = "Certificate" Table = "Certificate"> <meta attribute = "Class-Description"> คลาสนี้มีระเบียนใบรับรอง </meta> <id name = "id" type = "int" คอลัมน์ = "id"> <generator/> </id> <property name = "name" คอลัมน์ = "certificate_name" type = "String"/> </class> </hibernate-mapping>
รูปแบบ <classname> .hbm.xml ในไฟล์การแมปที่ควรบันทึก บันทึก File Employee.hbm.xml ในไฟล์การแมป คุ้นเคยกับรายละเอียดการแมปส่วนใหญ่การแมปองค์ประกอบทั้งหมดในไฟล์:
เอกสารที่แมปเป็นเอกสาร XML ที่มี <Hibernate-Mapping> เป็นองค์ประกอบรูทที่สอดคล้องกับแต่ละคลาสที่มีองค์ประกอบ 2 <class>
องค์ประกอบ <class> ใช้เพื่อกำหนดตารางฐานข้อมูลการแมปเฉพาะจากคลาส Java ชื่อคลาส Java ระบุแอตทริบิวต์ชื่อขององค์ประกอบคลาสและชื่อตารางแอตทริบิวต์ชื่อตารางระบุ
องค์ประกอบ <meta> เป็นองค์ประกอบเสริมที่สามารถใช้ในการสร้างคำอธิบายของคลาส
องค์ประกอบ <id> แมปแอตทริบิวต์ ID ที่ไม่ซ้ำกันในคลาสกับคีย์หลักของตารางฐานข้อมูล แอตทริบิวต์ชื่อขององค์ประกอบ ID หมายถึงคลาสของแอตทริบิวต์และแอตทริบิวต์คอลัมน์หมายถึงคอลัมน์ในตารางฐานข้อมูล แอตทริบิวต์ประเภทบันทึกประเภทการแมปไฮเบอร์เนตซึ่งจะถูกแปลงจาก Java เป็นประเภทข้อมูล SQL
องค์ประกอบ <erenator> ภายในองค์ประกอบ ID ใช้เพื่อสร้างค่าคีย์หลักโดยอัตโนมัติ ตั้งค่าแอตทริบิวต์คลาสขององค์ประกอบที่สร้างขึ้นเป็นต้นฉบับเพื่อให้ไฮเบอร์เนตหยิบขึ้นมาไม่ว่าจะเป็นตัวตน, ลำดับหรืออัลกอริทึม HILO เพื่อสร้างคีย์หลักตามความสามารถในการสนับสนุนของฐานข้อมูลพื้นฐาน
องค์ประกอบ <porement> ใช้เพื่อแมปคุณสมบัติของคลาส Java ไปยังคอลัมน์ในตารางฐานข้อมูล แอตทริบิวต์ชื่อขององค์ประกอบหมายถึงคลาสของแอตทริบิวต์และแอตทริบิวต์คอลัมน์หมายถึงคอลัมน์ในตารางฐานข้อมูล แอตทริบิวต์ประเภทบันทึกประเภทการแมปไฮเบอร์เนตซึ่งจะถูกแปลงจาก Java เป็นประเภทข้อมูล SQL
องค์ประกอบ <et> เป็นใหม่และได้รับการแนะนำให้ตั้งค่าความสัมพันธ์ระหว่างใบรับรองและชั้นเรียนของพนักงาน เราใช้องค์ประกอบ <et> ในแอตทริบิวต์ Cascade เพื่อบอก Hibernate เพื่อบันทึกวัตถุใบรับรองและวัตถุพนักงาน แอตทริบิวต์ชื่อถูกตั้งค่าให้ตั้งค่าตัวแปรในคำจำกัดความในคลาสพาเรนต์ในกรณีของเราคือใบรับรอง สำหรับชุดของตัวแปรแต่ละชุดเราจำเป็นต้องกำหนดชุดองค์ประกอบแยกต่างหากในไฟล์การแมป
องค์ประกอบ <sey> เป็นวัตถุหลักที่มีคีย์ต่างประเทศนั่นคือคอลัมน์ในตารางใบรับรอง พนักงานตาราง
องค์ประกอบ <หนึ่งถึงหลายคนระบุว่าวัตถุพนักงานเกี่ยวข้องกับใบรับรองจำนวนมากดังนั้นวัตถุใบรับรองจะต้องเกี่ยวข้องกับพนักงานหลัก คุณสามารถใช้ใด ๆ และ <หนึ่งต่อหนึ่ง>, <หลายต่อหนึ่ง> หรือ <หลายต่อหลาย ๆ องค์ประกอบตามต้องการ
สร้างคลาสแอปพลิเคชัน:
ในที่สุดเราจะสร้างวิธีการหลัก () ของคลาสแอปพลิเคชันเพื่อเรียกใช้แอปพลิเคชัน เราจะใช้แอพนี้เพื่อบันทึกระเบียนพนักงานบางส่วนพร้อมกับข้อมูลรับรองจากนั้นเราจะสมัครบันทึกการดำเนินการ CRUD
นำเข้า Java.util.*; นำเข้า org.hibernate.HibernateException; นำเข้า org.hibernate.session; นำเข้า org.hibernate.transaction; นำเข้า org.hibernate.sessionfactory; นำเข้า org.hibernate.cfg.configuration; การจัดการระดับสาธารณะ โมฆะคงที่สาธารณะหลัก (สตริง [] args) {ลอง {โรงงาน = การกำหนดค่าใหม่ (). configure (). buildSessionFactory (); } catch (throwable ex) {system.err.println ("ล้มเหลวในการสร้างวัตถุ SessionFactory" + ex); โยนข้อยกเว้นใหม่ IniniNitializerError (EX); } managemployee me = new Managemployee (); / * ให้เรามีชุดใบรับรองสำหรับพนักงานคนแรก */ hashset set1 = new hashset (); set1.add (ใบรับรองใหม่ ("MCA")); set1.add (ใบรับรองใหม่ ("MBA")); set1.add (ใบรับรองใหม่ ("MBA")); set1.add (ใบรับรองใหม่ ("PMP")); / * เพิ่มระเบียนพนักงานในฐานข้อมูล */ จำนวนเต็ม EMPID1 = Me.addemployee ("Manoj", "Kumar", 4000, set1); / * ชุดใบรับรองอื่นสำหรับพนักงานคนที่สอง */ hashset set2 = new hashset (); set2.add (ใบรับรองใหม่ ("BCA")); set2.add (ใบรับรองใหม่ ("ba")); / * เพิ่มระเบียนพนักงานอื่นในฐานข้อมูล */ จำนวนเต็ม Empid2 = Me.addemployee ("Dilip", "Kumar", 3000, set2); / * แสดงรายการพนักงานทั้งหมด */ me.listemployee (); / * อัปเดตบันทึกเงินเดือนของพนักงาน */ me.updateemployee (EMPID1, 5000); / * ลบพนักงานจากฐานข้อมูล */ me.deleteEmployee (EMPID2); / * แสดงรายการพนักงานทั้งหมด */ me.listemployee (); } / * เมธอดเพื่อเพิ่มระเบียนพนักงานในฐานข้อมูล * / addemployee (String fname, String lname, เงินเดือน int, cert cert) {เซสชัน session = factory.opensession (); ธุรกรรม tx = null; จำนวนเต็ม EmployeeId = null; ลอง {tx = session.beginTransaction (); พนักงานพนักงานพนักงาน = พนักงานใหม่ (fname, lname, เงินเดือน); Employee.SetCertificates (ใบรับรอง); EmployeeId = (จำนวนเต็ม) เซสชั่น SAVE (พนักงาน); tx.commit (); } catch (hibernateException e) {ถ้า (tx! = null) tx.rollback (); E.PrintStackTrace (); } ในที่สุด {session.close (); } return EmployeeId; } / * วิธีการแสดงรายละเอียดพนักงานทั้งหมด * / โมฆะสาธารณะ Listemployees () {เซสชันเซสชัน = factory.opensession (); ธุรกรรม tx = null; ลอง {tx = session.beginTransaction (); รายการพนักงาน = เซสชัน. createquery ("จากพนักงาน"). list (); สำหรับ (iterator iterator1 = พนักงาน. titerator (); iterator1.hasnext ();) {พนักงานพนักงาน = (พนักงาน) iterator1.next (); System.out.print ("ชื่อแรก:" + Employee.getFirstName ()); System.out.print ("นามสกุล:" + Employee.getLastName ()); System.out.println ("เงินเดือน:" + Employee.getSalary ()); SET CERTIVETATES = Employee.GetCertificates (); สำหรับ (iterator iterator2 = certificates.iterator (); iterator2.hasnext ();) {ใบรับรอง certname = (ใบรับรอง) iterator2.next (); System.out.println ("ใบรับรอง:" + certname.getName ()); }} tx.Commit (); } catch (hibernateException e) {ถ้า (tx! = null) tx.rollback (); E.PrintStackTrace (); } ในที่สุด {session.close (); }} / * วิธีการอัปเดตเงินเดือนสำหรับพนักงาน * / โมฆะสาธารณะอัพเดต public updateMployee (จำนวนเต็ม EmployeeId, เงินเดือน int) {เซสชันเซสชัน = factory.opensession (); ธุรกรรม tx = null; ลอง {tx = session.beginTransaction (); พนักงานพนักงานพนักงาน = (พนักงาน) เซสชั่น get (Employee.class, EmployeeId); พนักงาน. Setsalary (เงินเดือน); session.update (พนักงาน); tx.commit (); } catch (hibernateException e) {ถ้า (tx! = null) tx.rollback (); E.PrintStackTrace (); } ในที่สุด {session.close (); }} / * วิธีการลบพนักงานออกจากบันทึก * / โมฆะสาธารณะ deleteemployee (จำนวนเต็ม EmployeeId) {เซสชันเซสชัน = factory.opensession (); ธุรกรรม tx = null; ลอง {tx = session.beginTransaction (); พนักงานพนักงานพนักงาน = (พนักงาน) เซสชั่น get (Employee.class, EmployeeId); session.delete (พนักงาน); tx.commit (); } catch (hibernateException e) {ถ้า (tx! = null) tx.rollback (); E.PrintStackTrace (); } ในที่สุด {session.close (); - รวบรวมและดำเนินการ:
นี่คือขั้นตอนในการรวบรวมและเรียกใช้แอปพลิเคชันด้านบน ตรวจสอบให้แน่ใจว่ามีการตั้งค่าเส้นทางและ classpath อย่างเหมาะสมก่อนที่จะรวบรวมและดำเนินการ
ผลลัพธ์ต่อไปนี้จะได้รับบนหน้าจอและบันทึกจะถูกสร้างขึ้นในตารางพนักงานและใบรับรอง
$ java managemployee
..... ข้อความบันทึกต่าง ๆ จะแสดงที่นี่ ......... ชื่อแรก: Manoj นามสกุล: Kumar เงินเดือน: 4000Certificate: MBACERTIFICATE: PMPCERTIFICATE: MCAFIRST ชื่อ: DILIP นามสกุล: KUMAR เงินเดือน: 3000Certificate: BCACERTICATE: BAFIRST
หากคุณตรวจสอบแบบฟอร์มพนักงานและใบรับรองคุณควรบันทึก:
mysql> เลือก * จากพนักงาน;
- id | first_name | Last_name | เงินเดือน |+--------------------------------+------------+-----------+| 1 | Manoj | Kumar | 5000 |+----------------------------+---------+1 แถวในชุด (0.00 วินาที)
mysql> เลือก * จากใบรับรอง;
- id | ใบรับรอง _name | Employee_id |+----+------------------+-------------+| 1 | MBA | 1 || 2 | PMP | 1 || 3 | MCA | 1 |+----+------------------+-------------+3 แถวในชุด (0.00 วินาที)
mysql>
ชุด
SortedSet เป็นคอลเลกชัน Java ที่ไม่มีองค์ประกอบและองค์ประกอบที่ซ้ำกันใด ๆ ที่ใช้ให้เป็นระเบียบตามธรรมชาติของพวกเขาหรือจัดเรียงตามตัวเปรียบเทียบ
แผนที่ SortedSet เริ่มต้นในตารางการแมป <Set> องค์ประกอบและ java.util.Treeset แอตทริบิวต์การเรียงลำดับสามารถตั้งค่าเป็นตัวเปรียบเทียบหรือลำดับธรรมชาติ หากมีการใช้ลำดับตามธรรมชาติแล้วตัววนซ้ำของมันจะผ่านองค์ประกอบที่ตั้งไว้ที่จัดเรียงตามลำดับจากน้อยไปมาก
เรายังคงใช้ตาราง RDBMS ที่กำหนดไว้ในตัวอย่างด้านบนและจะมีความสัมพันธ์ระหว่างพนักงานหลายคนและวัตถุใบรับรองและคลาส POJO ก็ถูกกำหนดไว้ข้างต้น
ลองใช้พนักงาน Pojo Class จะถูกใช้เพื่อเก็บรวบรวมวัตถุในตารางพนักงานและตัวแปร Sortedset ที่ได้รับการรับรอง
ตอนนี้เรามากำหนดใบรับรองสำหรับคลาส POJO อื่นที่สอดคล้องกับตารางใบรับรองวัตถุใบรับรองดังกล่าวสามารถจัดเก็บและดึงตารางใบรับรองได้ คลาสนี้ควรใช้อินเทอร์เฟซที่เปรียบเทียบได้และวิธีการเปรียบเทียบจะถูกใช้เพื่อตั้งค่า sort = "ธรรมชาติ" ในกรณีของไฟล์การแมป (ดูไฟล์แผนที่ด้านล่าง) องค์ประกอบจะถูกเรียงลำดับ
ใบรับรองคลาสสาธารณะใช้การเปรียบเทียบ <ใบรับรอง> {ID INT ส่วนตัว; ชื่อสตริงส่วนตัว; ใบรับรองสาธารณะ () {} ใบรับรองสาธารณะ (ชื่อสตริง) {this.name = name; } สาธารณะ int getId () {return id; } โมฆะสาธารณะ setId (int id) {this.id = id; } สตริงสาธารณะ getName () {ชื่อคืน; } โมฆะสาธารณะ setName (ชื่อสตริง) {this.name = name; } public int compereto (ใบรับรองที่) {int สุดท้ายก่อน = -1; int สุดท้ายหลัง = 1; ถ้า (นั่น == null) {กลับมาก่อน; } เปรียบเทียบ thiscertificate = this.getName (); เทียบเท่า thatcertificate = that.getName (); if (thiscertificate == null) {return หลังจาก; } อื่นถ้า (thatcertificate == null) {return ก่อน; } else {return thiscertificate.compareto (thatcertificate); }}} กำหนดไฟล์การแมปไฮเบอร์เนต:
ลองพัฒนาไฟล์การแมปที่ระบุว่า Hibernate กำหนดไฟล์การแมปที่แมปกับตารางฐานข้อมูลอย่างไร องค์ประกอบ <et> จะถูกใช้เพื่อกำหนดกฎสำหรับคอลเลกชัน SortedSet ที่ใช้
<? XML เวอร์ชัน = "1.0" การเข้ารหัส = "UTF-8"?> <! Doctype Hibernate-Mapping สาธารณะ "-// hibernate/hibernate mapping dtd // en" "http://www.hibernate.org/dtd/hibernate-mapping-3 table = "พนักงาน"> <meta attribute = "Class-Description"> คลาสนี้มีรายละเอียดของพนักงาน </meta> <id name = "id" type = "int" คอลัมน์ = "id"> <generator/> </id> <set name = "ใบรับรอง" cascade = "all" sort = "myclass"> <คีย์คอลัมน์ = "exprolee_id"/> column = "last_name" type = "string"/> <property name = "เงินเดือน" คอลัมน์ = "เงินเดือน" type = "int"/> </class> <class name = "certificate" table = "ใบรับรอง"> <meta attribute = "คลาสการอธิบาย"> คลาสนี้มีบันทึกใบรับรอง </meta> <id name = "id" type = "int" คอลัมน์ = "id"> <generator/> </id> <property name = "name" คอลัมน์ = "certificate_name" type = "String"/> </class> </hibernate-mapping>
รูปแบบ <classname> .hbm.xml ในไฟล์แผนที่บันทึก File Employee.hbm.xml ในไฟล์แผนที่ ฉันคุ้นเคยกับรายละเอียดการแมปส่วนใหญ่แล้ว แต่เรามาดูองค์ประกอบทั้งหมดในไฟล์การแมป:
เอกสารที่แมปเป็นเอกสาร XML ที่มี <Hibernate-Mapping> เป็นองค์ประกอบรูทที่สอดคล้องกับแต่ละคลาสที่มีองค์ประกอบ 2 <class>
องค์ประกอบ <class> ใช้เพื่อกำหนดตารางฐานข้อมูลการแมปเฉพาะจากคลาส Java ชื่อคลาส Java ระบุแอตทริบิวต์ชื่อขององค์ประกอบคลาสและชื่อตารางแอตทริบิวต์ชื่อตารางระบุ
องค์ประกอบ <meta> เป็นองค์ประกอบเสริมที่สามารถใช้ในการสร้างคำอธิบายของคลาส
องค์ประกอบ <id> แมปแอตทริบิวต์ ID ที่ไม่ซ้ำกันในคลาสกับคีย์หลักของตารางฐานข้อมูล แอตทริบิวต์ชื่อขององค์ประกอบ ID หมายถึงคลาสของแอตทริบิวต์และแอตทริบิวต์คอลัมน์หมายถึงคอลัมน์ในตารางฐานข้อมูล แอตทริบิวต์ประเภทบันทึกประเภทการแมปไฮเบอร์เนตซึ่งจะถูกแปลงจาก Java เป็นประเภทข้อมูล SQL
องค์ประกอบ <erenator> ภายในองค์ประกอบ ID ใช้เพื่อสร้างค่าคีย์หลักโดยอัตโนมัติ ตั้งค่าแอตทริบิวต์คลาสขององค์ประกอบที่สร้างขึ้นเพื่อให้ไฮเบอร์เนตรับอัลกอริทึมในตัวตนลำดับหรือ HILO เพื่อสร้างคีย์หลักตามความสามารถในการสนับสนุนของฐานข้อมูลพื้นฐาน
องค์ประกอบ <porement> ใช้เพื่อแมปคุณสมบัติของคลาส Java ไปยังคอลัมน์ในตารางฐานข้อมูล แอตทริบิวต์ชื่อขององค์ประกอบหมายถึงคลาสของแอตทริบิวต์และแอตทริบิวต์คอลัมน์หมายถึงคอลัมน์ในตารางฐานข้อมูล แอตทริบิวต์ประเภทบันทึกประเภทการแมปไฮเบอร์เนตซึ่งจะถูกแปลงจาก Java เป็นประเภทข้อมูล SQL
องค์ประกอบ <et> ใช้เพื่อตั้งค่าความสัมพันธ์ระหว่างใบรับรองและคลาสพนักงาน เราใช้องค์ประกอบ <et> ในแอตทริบิวต์ Cascade เพื่อบอก Hibernate เพื่อบันทึกวัตถุใบรับรองและไปยังวัตถุพนักงาน แอตทริบิวต์ชื่อถูกตั้งค่าเป็นตัวแปรของชุดที่กำหนดไว้ในคลาสหลักในกรณีของเรามันเป็นใบรับรอง คุณสมบัติการเรียงลำดับสามารถตั้งค่าเป็นการเรียงลำดับตามธรรมชาติหรือสามารถตั้งค่าเป็นคลาสที่กำหนดเองเป็น java.util.comparator เราได้ใช้คลาส MyClass ที่ใช้มันเป็น java.util.Comparator เพื่อย้อนกลับลำดับการเรียงลำดับของการใช้งานคลาสใบรับรอง
องค์ประกอบ <sey> เป็นวัตถุหลักที่มีคีย์ต่างประเทศนั่นคือคอลัมน์ในตารางใบรับรอง พนักงานตาราง
องค์ประกอบ <หนึ่งถึงหลายคน> ระบุว่าวัตถุพนักงานเกี่ยวข้องกับวัตถุใบรับรองจำนวนมากดังนั้นวัตถุใบรับรองจะต้องเกี่ยวข้องกับพนักงานหลัก คุณสามารถใช้ใด ๆ และ <หนึ่งต่อหนึ่ง>, <หลายต่อหนึ่ง> หรือ <หลายต่อหลาย ๆ องค์ประกอบตามต้องการ
หากคุณใช้การตั้งค่า Sort = "Natural" คุณไม่จำเป็นต้องสร้างคลาสแยกต่างหากเนื่องจากคลาสใบรับรองได้ใช้อินเทอร์เฟซที่เปรียบเทียบได้และ Hibernate จะใช้ comparTo (กำหนดเป็นชื่อใบรับรองการเปรียบเทียบในคลาสใบรับรอง) อย่างไรก็ตามเรากำลังใช้คลาสเปรียบเทียบที่กำหนดเอง MyClass ในไฟล์การแมปของเราดังนั้นเราต้องสร้างคลาสนี้ตามอัลกอริทึมการเรียงลำดับ ใช้คลาสนี้เพื่อเรียงลำดับตามลำดับมากไปน้อย
นำเข้า Java.util.Comparator; MyClass คลาสสาธารณะใช้เครื่องเปรียบเทียบ <ใบรับรอง> {INT สาธารณะเปรียบเทียบ (ใบรับรอง O1, ใบรับรอง O2) {สุดท้าย Int ก่อน = -1; int สุดท้ายหลัง = 1; / * หากต้องการย้อนกลับลำดับการเรียงลำดับหลายตัวโดย -1 */ if (o2 == null) {return ก่อน * -1; } เปรียบเทียบ thiscertificate = o1.getName (); เทียบเท่ากับ ecertificate = o2.getName (); if (thiscertificate == null) {return หลังจาก * 1; } อื่นถ้า (thatcertificate == null) {return ก่อน * -1; } else {return thiscertificate.compareto (thatcertificate) * -1; - สร้างคลาสแอปพลิเคชัน:
ในที่สุดเราจะสร้างวิธีการหลัก () ของคลาสแอปพลิเคชันเพื่อเรียกใช้แอปพลิเคชัน เราจะใช้แอพนี้เพื่อบันทึกระเบียนพนักงานบางส่วนพร้อมกับใบรับรองจากนั้นเราจะสมัครบันทึกการดำเนินการ CRUD
นำเข้า Java.util.*; นำเข้า org.hibernate.HibernateException; นำเข้า org.hibernate.session; นำเข้า org.hibernate.transaction; นำเข้า org.hibernate.sessionfactory; นำเข้า org.hibernate.cfg.configuration; การจัดการระดับสาธารณะ โมฆะคงที่สาธารณะหลัก (สตริง [] args) {ลอง {โรงงาน = การกำหนดค่าใหม่ (). configure (). buildSessionFactory (); } catch (throwable ex) {system.err.println ("ล้มเหลวในการสร้างวัตถุ SessionFactory" + ex); โยนข้อยกเว้นใหม่ IniniNitializerError (EX); } managemployee me = new Managemployee (); / * ให้เรามีชุดใบรับรองสำหรับพนักงานคนแรก */ treeet set1 = new Treeset (); set1.add (ใบรับรองใหม่ ("MCA")); set1.add (ใบรับรองใหม่ ("MBA")); set1.add (ใบรับรองใหม่ ("MBA")); set1.add (ใบรับรองใหม่ ("PMP")); / * เพิ่มระเบียนพนักงานในฐานข้อมูล */ จำนวนเต็ม EMPID1 = Me.addemployee ("Manoj", "Kumar", 4000, set1); / * ชุดใบรับรองอื่นสำหรับพนักงานคนที่สอง */ treeet set2 = new Treeset (); set2.add (ใบรับรองใหม่ ("BCA")); set2.add (ใบรับรองใหม่ ("ba")); / * เพิ่มระเบียนพนักงานอื่นในฐานข้อมูล */ จำนวนเต็ม Empid2 = Me.addemployee ("Dilip", "Kumar", 3000, set2); / * แสดงรายการพนักงานทั้งหมด */ me.listemployee (); / * อัปเดตบันทึกเงินเดือนของพนักงาน */ me.updateemployee (EMPID1, 5000); / * ลบพนักงานจากฐานข้อมูล */ me.deleteEmployee (EMPID2); / * แสดงรายการพนักงานทั้งหมด */ me.listemployee (); } / * เมธอดเพื่อเพิ่มระเบียนพนักงานในฐานข้อมูล * / addemployee (String fname, String lname, เงินเดือน int, cert sortedset) {เซสชันเซสชัน = Factory.opensession (); ธุรกรรม tx = null; จำนวนเต็ม EmployeeId = null; ลอง {tx = session.beginTransaction (); พนักงานพนักงานพนักงาน = พนักงานใหม่ (fname, lname, เงินเดือน); Employee.SetCertificates (ใบรับรอง); EmployeeId = (จำนวนเต็ม) เซสชั่น SAVE (พนักงาน); tx.commit (); } catch (hibernateException e) {ถ้า (tx! = null) tx.rollback (); E.PrintStackTrace (); } ในที่สุด {session.close (); } return EmployeeId; } / * วิธีการแสดงรายละเอียดพนักงานทั้งหมด * / โมฆะสาธารณะ Listemployees () {เซสชันเซสชัน = factory.opensession (); ธุรกรรม tx = null; ลอง {tx = session.beginTransaction (); รายการพนักงาน = เซสชัน. createquery ("จากพนักงาน"). list (); สำหรับ (iterator iterator1 = พนักงาน. titerator (); iterator1.hasnext ();) {พนักงานพนักงาน = (พนักงาน) iterator1.next (); System.out.print ("ชื่อแรก:" + Employee.getFirstName ()); System.out.print ("นามสกุล:" + Employee.getLastName ()); System.out.println ("เงินเดือน:" + Employee.getSalary ()); ใบรับรอง SortedSet = Employee.getCertificates (); สำหรับ (iterator iterator2 = certificates.iterator (); iterator2.hasnext ();) {ใบรับรอง certname = (ใบรับรอง) iterator2.next (); System.out.println ("ใบรับรอง:" + certname.getName ()); }} tx.Commit (); } catch (hibernateException e) {ถ้า (tx! = null) tx.rollback (); E.PrintStackTrace (); } ในที่สุด {session.close (); }} / * วิธีการอัปเดตเงินเดือนสำหรับพนักงาน * / โมฆะสาธารณะอัพเดต public updateMployee (จำนวนเต็ม EmployeeId, เงินเดือน int) {เซสชันเซสชัน = factory.opensession (); ธุรกรรม tx = null; ลอง {tx = session.beginTransaction (); พนักงานพนักงานพนักงาน = (พนักงาน) เซสชั่น get (Employee.class, EmployeeId); พนักงาน. Setsalary (เงินเดือน); session.update (พนักงาน); tx.commit (); } catch (hibernateException e) {ถ้า (tx! = null) tx.rollback (); E.PrintStackTrace (); } ในที่สุด {session.close (); }} / * วิธีการลบพนักงานออกจากบันทึก * / โมฆะสาธารณะ deleteemployee (จำนวนเต็ม EmployeeId) {เซสชันเซสชัน = factory.opensession (); ธุรกรรม tx = null; ลอง {tx = session.beginTransaction (); พนักงานพนักงานพนักงาน = (พนักงาน) เซสชั่น get (Employee.class, EmployeeId); session.delete (พนักงาน); tx.commit (); } catch (hibernateException e) {ถ้า (tx! = null) tx.rollback (); E.PrintStackTrace (); } ในที่สุด {session.close (); -หลังจากรวบรวมและดำเนินการผลลัพธ์ต่อไปนี้จะได้รับบนหน้าจอและบันทึกจะถูกสร้างขึ้นทั้งในตารางพนักงานและใบรับรอง คุณจะเห็นว่าใบรับรองได้รับการจัดเรียงตามลำดับตรงกันข้าม คุณสามารถลองได้โดยการเปลี่ยนไฟล์การแมปเพียง SET SOLT = "Natural" และดำเนินการโปรแกรมและเปรียบเทียบผลลัพธ์
$ java managemployee
..... ข้อความบันทึกต่าง ๆ จะแสดงที่นี่ ......... ชื่อแรก: Manoj นามสกุล: Kumar เงินเดือน: 4000Certificate: PMPCertificate: McAcertificate: Mbafirst ชื่อ: DILIP นามสกุล: Kumar เงินเดือน: 3000Certificate: Bcacertificate: Bafirst Name
หากคุณตรวจสอบแบบฟอร์มพนักงานและใบรับรองคุณควรบันทึก:
mysql> เลือก * จากพนักงาน;
- id | first_name | Last_name | เงินเดือน |+--------------------------------+------------+-----------+| 1 | Manoj | Kumar | 5000 |+----------------------------+---------+1 แถวในชุด (0.00 วินาที)
mysql> เลือก * จากใบรับรอง;
- id | ใบรับรอง _name | Employee_id |+----+------------------+-------------+| 1 | MBA | 1 || 2 | PMP | 1 || 3 | MCA | 1 |+----+------------------+-------------+3 แถวในชุด (0.00 วินาที)