العديد إلى واحد رسم الخرائط
العديد من الارتباطات هي العلاقات الأكثر شيوعًا للربط ، حيث يمكن ربط كائن بكائنات متعددة. على سبيل المثال ، قد يرتبط كائن عنوان متطابق بكائنات من موظفين متعددين.
تحديد جدول RDBMS:
فكر في موقف نحتاج فيه إلى تخزين سجلات الموظف في جدول الموظف ، والذي سيكون له الهيكل التالي:
إنشاء موظف الجدول (ID int not null auto_increment ، first_name varchar (20) الافتراضي ، last_name varchar (20) الافتراضي ، الراتب الافتراضي int null ، العنوان int not null ، المفتاح الأساسي (المعرف)) ؛
علاوة على ذلك ، يمكن للعديد من الموظفين الحصول على نفس العنوان ، بحيث يمكن تقديم هذه الارتباط باستخدام العديد من الجمعيات الفردية. نقوم بتخزين المعلومات المتعلقة بالعنوان في جدول منفصل مع الهيكل التالي:
إنشاء عنوان الجدول (ID int not null auto_increment ، street_name varchar (40) الافتراضي ، city_name varchar (40) الافتراضي الفارغ ، state_name varchar (40) null ، zipcode varchar (10) null ، المفتاح الأساسي (المعرف)) ؛
قم بإنشاء جداول RBDMS في نفس الوقت واتركهم يستعدون للتنفيذ التالي.
تعريف فئة Pojo:
دعنا ننفذ موظفًا في فئة POJO سيتم استخدامه للاحتفاظ بمتغيرات الكائن ونوع عنوانه مع جدول الموظف.
استيراد java.util.*؛ موظف الطبقة العامة {private int id ؛ سلسلة خاصة firstName ؛ سلسلة خاصة راتب الباحث الخاص ؛ عنوان العنوان الخاص ؛ الموظف العام () {} الموظف العام (سلسلة fname ، سلسلة lname ، int راتب ، عنوان العنوان) {this.firstName = fname ؛ this.lastname = lname ؛ هذا. this.address = العنوان ؛ } public int getId () {return id ؛ } public void setId (int id) {this.id = id ؛ } السلسلة العامة getFirstName () {return firstName ؛ } public void setFirstName (string first_name) {this.firstName = first_name ؛ } السلسلة العامة getLastName () {return lastName ؛ } public void setLastName (String last_name) {this.lastname = last_name ؛ } public int getSalary () {return salary ؛ } public void setSalary (int salary) {this.salary = salary ؛ } العنوان العام getAddress () {return address ؛ } public void setaddress (عنوان العنوان) {this.address = address ؛ }}نحتاج إلى تحديد جدول العنوان المقابل حتى يتمكن كائن العنوان من تخزين واسترداد فئة POJO أخرى في جدول العنوان.
استيراد java.util.*؛ عنوان الطبقة العامة {private int id ؛ شارع سلسلة خاصة سيتي سلسلة خاصة ؛ حالة السلسلة الخاصة ؛ سلسلة zipcode الخاصة ؛ العنوان العام () {} العنوان العام (String Street ، String City ، String State ، String Zipcode) {this.street = Street ؛ this.city = المدينة ؛ this.state = الدولة ؛ this.zipcode = zipcode ؛ } public int getId () {return id ؛ } public void setId (int id) {this.id = id ؛ } السلسلة العامة getStreet () {Return Street ؛ } public void setStreet (String Street) {this.street = street ؛ } السلسلة العامة getCity () {return City ؛ } public void setCity (String City) {this.city = City ؛ } السلسلة العامة getState () {return state ؛ } public void setState (String State) {this.state = state ؛ } السلسلة العامة getzipcode () {return zipcode ؛ } public void setzipcode (string zipcode) {this.zipcode = zipcode ؛ }} تحديد ملف تعيين السبات:
قم بتطوير ملف التعيين الخاص بنا الذي يرشد السبات كيفية تحديد الخريطة إلى جداول قاعدة البيانات. <العديد إلى واحد> سيتم استخدام عناصر المعالجة لتحديد القواعد لإنشاء علاقة كثيرة بين الموظف والكيانات المعالجة.
<؟ Table = "Employee"> <meta attribute = "class-description"> تحتوي هذه الفئة على تفاصيل الموظف. </meta> <id name = "id" type = "int" column = "id"> <generator/> </id> <property name = "firstName" column = "first_name" type = "string"/> <property name = "lastName" = "inter_name" type = "string"/> <propert not-null = "true"/> </slass> <class name = "address" table = "address"> <meta attribute = "class-description"> تحتوي هذه الفئة على تفاصيل العنوان. </meta> <id name = "id" type = "int" column = "id"> <generator/> </id> <property name = "street" column = "street_name" type = "string"/> <property name = "city" column = "city_name" type = "string"/> <property name = "state_name type = "string"/> </class> </mibernate mapping>
التنسيق <SlassName> .hbm.xml في ملف التعيين الذي يجب حفظه. احفظ الملف الموظف. hbm.xml في ملف التعيين. على دراية بالفعل بمعظم تفاصيل التعيين ، ولكن دعونا نلقي نظرة على جميع العناصر في ملف التعيين مرة أخرى:
المستند المعين هو مستند XML مع <hibernate mapping> كعنصر جذر يتوافق مع كل فئة تحتوي على 2 <Class> عناصر.
يتم استخدام عنصر <Slass> لتحديد تعيين جدول قاعدة البيانات من فئة Java. يحدد اسم فئة Java سمة الاسم لعنصر الفئة ويحدد اسم جدول قاعدة بيانات سمة الجدول.
عنصر <meta> هو عنصر اختياري يمكن استخدامه لإنشاء وصف للفصل.
يقوم عنصر <ID> بتخطيط سمة المعرف الفريد في الفصل إلى المفتاح الأساسي لجدول قاعدة البيانات. تشير سمة اسم عنصر المعرف إلى فئة السمة وتشير سمة العمود إلى الأعمدة في جدول قاعدة البيانات. تقوم سمة النوع بحفظ نوع تعيين السبات ، والذي سيتم تحويله من جافا إلى نوع بيانات SQL.
يتم استخدام قيمة المفتاح الأساسي في عنصر <enderator> داخل عنصر المعرف لإنشاء تلقائي. قم بتعيين سمة الفصل للعنصر الذي تم إنشاؤه للسماح لـ Hibernate بالتقاط خوارزميات ما إذا كانت الهوية أو التسلسل أو Hilo لإنشاء مفاتيح أساسية وفقًا لقدرات الدعم لقاعدة البيانات الأساسية.
يتم استخدام العنصر <Property> لتعيين خصائص فئة Java إلى أعمدة في جدول قاعدة البيانات. تشير سمة اسم العنصر إلى فئة السمة وتشير سمة العمود إلى الأعمدة في جدول قاعدة البيانات. تقوم سمة النوع بحفظ نوع تعيين السبات ، والذي سيتم تحويله من جافا إلى نوع بيانات SQL.
يتم استخدام عنصر المعالجة <-to-واحد> لتعيين العلاقة بين الموظف والكيان الذي يعالج. يتم تعيين سمة الاسم على متغير محدد في الفئة الأصل ، في حالتنا هو العنوان. يتم استخدام سمة العمود لأسماء الأعمدة في مجموعة موظف الجدول الأصل.
أخيرًا ، سنقوم بإنشاء الطريقة الرئيسية () لفئة التطبيق لتشغيل التطبيق. سوف نستخدم هذا التطبيق لإنقاذ بعض الموظفين مع عنوانهم لتسجيل عنوانهم ، وبعد ذلك سوف نتقدم بطلب للحصول على عملية CRUD في السجل.
استيراد java.util.*؛ استيراد org.hibernate.hibernateException ؛ استيراد org.hibernate.session ؛ استيراد org.hibernate.transaction ؛ استيراد org.hibernate.sessionfactory ؛ استيراد org.hibernate.cfg.configuration ؛ الطبقة العامة إدارة {Private Static SessionFactory Factory ؛ public static void main (string [] args) {try {factory = new configuration (). configure (). BuildSessionFactory () ؛ } catch (throwable ex) {system.err.println ("فشل في إنشاء كائن SessionFactory." + ex) ؛ رمي استثناء جديد initializererror (ex) ؛ } managementemive me = new ManagementEmployee () ؛ / * دعنا نحصل على كائن عنوان واحد */ عنوان عنوان = me.addaddress ("Kondapur" ، "Hyderabad" ، "AP" ، "532") ؛ / * إضافة سجلات الموظف في قاعدة البيانات */ integer empid1 = me.addemplyee ("manoj" ، "kumar" ، 4000 ، address) ؛ / * إضافة سجل موظف آخر في قاعدة البيانات */ integer EMPID2 = me.addemplyee ("dilip" ، "kumar" ، 3000 ، address) ؛ / * اذكر جميع الموظفين */ me.listemplyee () ؛ / * تحديث سجلات رواتب الموظف */ me.updateemplyee (Empid1 ، 5000) ؛ / * حذف موظف من قاعدة البيانات */ me.deleteemplyee (EMPID2) ؛ / * سرد جميع الموظفين */ me.listemplyees () ؛ } / * طريقة لإضافة سجل عنوان في قاعدة البيانات * / عنوان العنوان العام (String Street ، String City ، String State ، String Zipcode) {Session Session = Factory.Opensession () ؛ المعاملة tx = فارغة ؛ عدد صحيح addressId = فارغة ؛ عنوان العنوان = فارغ ؛ حاول {tx = session.begintransaction () ؛ العنوان = العنوان الجديد (الشارع ، المدينة ، الولاية ، zipcode) ؛ addressId = (integer) session.save (العنوان) ؛ tx.Commit () ؛ } catch (hibernateException e) {if (tx! = null) tx.rollback () ؛ E.PrintStackTrace () ؛ } أخيرًا {session.close () ؛ } عنوان الإرجاع ؛ } / * طريقة لإضافة سجل موظف في قاعدة البيانات * / public Integer Addemployee (سلسلة fname ، سلسلة lname ، int راتب ، عنوان العنوان) {جلسة الجلسة = factory.opensession () ؛ المعاملة tx = فارغة ؛ عدد صحيح الموظف = فارغ ؛ حاول {tx = session.begintransaction () ؛ الموظف الموظف = موظف جديد (fname ، lname ، الراتب ، العنوان) ؛ effereneiD = (عدد صحيح) الجلسة. save (موظف) ؛ tx.Commit () ؛ } catch (hibernateException e) {if (tx! = null) tx.rollback () ؛ E.PrintStackTrace () ؛ } أخيرًا {session.close () ؛ } إرجاع الموظف ؛ } / * طريقة لسرد جميع تفاصيل الموظفين * / public void listemployees () {session session = factory.opensession () ؛ المعاملة tx = فارغة ؛ حاول {tx = session.begintransaction () ؛ قائمة الموظفين = session.createquery ("من الموظف"). list () ؛ لـ (iterator iterator = amploy.iterator () ؛ iterator.hasnext () ؛) {efferene efference = (ameptory) iterator.next () ؛ system.out.print ("الاسم الأول:" + efferene.getFirstName ()) ؛ system.out.print ("الاسم الأخير:" + efferene.getLastName ()) ؛ System.out.println ("Salary:" + efferene.getSalary ()) ؛ العنوان ADD = experiEDE.GETADDRESS () ؛ System.out.println ("العنوان") ؛ System.out.println ("Street:" + add.getStreet ()) ؛ System.out.println ("City:" + add.getCity ()) ؛ system.out.println ("state:" + add.getState ()) ؛ System.out.println ("zipcode:" + add.getzipcode ()) ؛ } tx.commit () ؛ } catch (hibernateException e) {if (tx! = null) tx.rollback () ؛ E.PrintStackTrace () ؛ } أخيرًا {session.close () ؛ }} / * طريقة تحديث الراتب للموظف * / public void uptordeMployee (integer amployeeId ، int salary) {session session = factory.opensession () ؛ المعاملة tx = فارغة ؛ حاول {tx = session.begintransaction () ؛ موظف الموظف = (الموظف) جلسة. الموظف. session.update (الموظف) ؛ tx.Commit () ؛ } catch (hibernateException e) {if (tx! = null) tx.rollback () ؛ E.PrintStackTrace () ؛ } أخيرًا {session.close () ؛ }} / * طريقة لحذف موظف من السجلات * / public void deleteemployee (integer efferenceId) {session session = factory.opensession () ؛ المعاملة tx = فارغة ؛ حاول {tx = session.begintransaction () ؛ موظف الموظف = (الموظف) جلسة. Session.delete (موظف) ؛ tx.Commit () ؛ } catch (hibernateException e) {if (tx! = null) tx.rollback () ؛ E.PrintStackTrace () ؛ } أخيرًا {session.close () ؛ }}} تجميع وتنفيذ:
فيما يلي الخطوات لتجميع وتشغيل التطبيق أعلاه. تأكد من تعيين المسار و classpath بشكل مناسب قبل التجميع والتنفيذ.
احصل على النتائج التالية على الشاشة ويتم إنشاء السجلات في كل من جداول الموظف والعناوين.
$ Java ManagementEmployee
..... ستعرض رسائل سجل مختلفة هنا ......... الاسم الأول: Manoj الاسم الأخير: كومار الراتب: 4000Address Street: Kondapur City: Hyderabad State: AP Zipcod الشارع: Kondapur City: حيدر أباد الدولة: AP Zipcode: 532
إذا قمت بفحص الموظف وجدول العناوين ، فيجب عليك تسجيله:
MySQL> حدد * من الموظف ؛
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
mysql> حدد * من العنوان ؛
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
رسم خرائط واحد إلى الرجل
يمكن تنفيذ رسم خرائط واحد إلى طابع باستخدام مجموعة من مجموعات Java التي لا تحتوي على أي عناصر مكررة. لقد رأينا كيفية تعيين خرائط في السبات ، لذلك إذا تعلمت عن تعيينات تعيين ، فيمكن استخدام جميع الإعدادات لتخصيصات واحدة إلى حد.
يتم تعيين المجموعة إلى العنصر <stip> في جدول الخريطة ويتم تهيئته في java.util.hashset. يمكنك استخدام مجموعة مجموعات في الفصل ، مع عنصر في المجموعة لا يتطلب الازدواجية.
ما زلنا نستخدم جدول RDBMS وفئات PoJO المحددة في المثال أعلاه.
تحديد ملف تعيين السبات:
دعونا نوجه السبات كيفية تحديد فئة تم تعيينها إلى ملف تعيين جدول قاعدة البيانات.
<؟ Table = "Employee"> <meta attribute = "class-description"> تحتوي هذه الفئة على تفاصيل الموظف. </meta> <name name = "id" type = "int" column = "id"> <generator/> </id> <set name = "cASCADE =" all "> <key column =" exepmite_id "/> <-to-many/> </set> <property name =" firstname "colum =" first_name "type = type = "string"/> <property name = "salary" column = "salary" type = "int"/> </class> <class name = "certificate" table = "certificate"> <meta attribute = "class-description"> تحتوي هذه الفئة على سجلات الشهادة. </meta> <id name = "id" type = "int" column = "id"> <eredator/> </id> <property name = "name" column = "certificate_name" type = "string"/> </slass> </ hibernate mapping>
التنسيق <SlassName> .hbm.xml في ملف التعيين الذي يجب حفظه. نقوم بحفظ الملف الموظف. hbm.xml في ملف التعيين. أنت على دراية بالفعل بمعظم تفاصيل التعيين ، ولكن دعونا نلقي نظرة على جميع العناصر في ملف التعيين مرة أخرى:
المستند المعين هو مستند XML مع <hibernate mapping> كعنصر جذر يتوافق مع كل فئة تحتوي على 2 <Class> عناصر.
يتم استخدام عنصر <Slass> لتحديد تعيين جدول قاعدة البيانات من فئة Java. يحدد اسم فئة Java سمة الاسم لعنصر الفئة ويحدد اسم جدول قاعدة بيانات سمة الجدول.
عنصر <meta> هو عنصر اختياري يمكن استخدامه لإنشاء وصف للفصل.
يقوم عنصر <ID> بتخطيط سمة المعرف الفريد في الفصل إلى المفتاح الأساسي لجدول قاعدة البيانات. تشير سمة اسم عنصر المعرف إلى فئة السمة وتشير سمة العمود إلى الأعمدة في جدول قاعدة البيانات. تقوم سمة النوع بحفظ نوع تعيين السبات ، والذي سيتم تحويله من جافا إلى نوع بيانات SQL.
يتم استخدام عنصر <enderator> داخل عنصر المعرف لإنشاء قيمة المفتاح الأساسي تلقائيًا. قم بتعيين سمة الفصل للعنصر الذي تم إنشاؤه للسماح بإسب السبات بالتقاط هوية أو تسلسل أو خوارزميات Hilo لإنشاء مفاتيح أساسية وفقًا لقدرات الدعم لقاعدة البيانات الأساسية.
يتم استخدام العنصر <Property> لتعيين خصائص فئة Java إلى أعمدة في جدول قاعدة البيانات. تشير سمة اسم العنصر إلى فئة السمة وتشير سمة العمود إلى الأعمدة في جدول قاعدة البيانات. تقوم سمة النوع بحفظ نوع تعيين السبات ، والذي سيتم تحويله من جافا إلى نوع بيانات SQL.
يعين العنصر <stip> العلاقة بين الشهادة وفئة الموظف. نستخدم العنصر <stip> في سمة Cascade لإخبار Hibernate لحفظ كائن الشهادة وأيضًا كائن الموظف. يتم تعيين سمة الاسم على مجموعة المتغيرات المحددة في الفئة الأصل ، في مثالنا هي الشهادة. لكل مجموعة من المتغيرات ، نحتاج إلى تحديد مجموعة منفصلة من العناصر في ملف التعيين.
العنصر <Kear> هو الكائن الأصل الذي يحتوي على مفتاح خارجي ، أي العمود في جدول الشهادة. موظف الجدول.
يشير العنصر <-One-Many> إلى أن كائن الموظف يتضمن العديد من الشهادات.
إنشاء فئة تطبيق:
أخيرًا ، سنقوم بإنشاء الطريقة الرئيسية () لفئة التطبيق لتشغيل التطبيق. سنستخدم هذا التطبيق لحفظ بعض الموظفين مع شهادة السجل ، ثم سنقوم بتطبيق سجل تشغيل CRUD على.
استيراد java.util.*؛ استيراد org.hibernate.hibernateException ؛ استيراد org.hibernate.session ؛ استيراد org.hibernate.transaction ؛ استيراد org.hibernate.sessionfactory ؛ استيراد org.hibernate.cfg.configuration ؛ الطبقة العامة إدارة {Private Static SessionFactory Factory ؛ public static void main (string [] args) {try {factory = new configuration (). configure (). BuildSessionFactory () ؛ } catch (throwable ex) {system.err.println ("فشل في إنشاء كائن SessionFactory." + ex) ؛ رمي استثناء جديد initializererror (ex) ؛ } managementemive me = new ManagementEmployee () ؛ / * دعنا نحصل على مجموعة من الشهادات للموظف الأول */ hashset set1 = new hashset () ؛ set1.add (شهادة جديدة ("MCA")) ؛ set1.add (شهادة جديدة ("ماجستير في إدارة الأعمال")) ؛ set1.add (شهادة جديدة ("ماجستير في إدارة الأعمال")) ؛ set1.add (شهادة جديدة ("PMP")) ؛ / * إضافة سجلات الموظفين في قاعدة البيانات */ integer empid1 = me.addemplyee ("manoj" ، "kumar" ، 4000 ، set1) ؛ / * مجموعة أخرى من الشهادات للموظف الثاني */ hashset set2 = new hashset () ؛ set2.add (شهادة جديدة ("BCA")) ؛ set2.add (شهادة جديدة ("BA")) ؛ / * إضافة سجل موظف آخر في قاعدة البيانات */ integer EMPID2 = ME.Addemplyee ("Dilip" ، "Kumar" ، 3000 ، set2) ؛ / * اذكر جميع الموظفين */ me.listemplyee () ؛ / * تحديث سجلات رواتب الموظف */ me.updateemplyee (Empid1 ، 5000) ؛ / * حذف موظف من قاعدة البيانات */ me.deleteemplyee (EMPID2) ؛ / * اذكر جميع الموظفين */ me.listemplyee () ؛ } / * طريقة لإضافة سجل موظف في قاعدة البيانات * / public Integer Addemployee (السلسلة fname ، سلسلة lname ، int salary ، set cert) {session session = factory.opensession () ؛ المعاملة tx = فارغة ؛ عدد صحيح الموظف = فارغ ؛ حاول {tx = session.begintransaction () ؛ الموظف الموظف = موظف جديد (fname ، lname ، الراتب) ؛ الموظف. effereneiD = (عدد صحيح) الجلسة. save (موظف) ؛ tx.Commit () ؛ } catch (hibernateException e) {if (tx! = null) tx.rollback () ؛ E.PrintStackTrace () ؛ } أخيرًا {session.close () ؛ } إرجاع الموظف ؛ } / * طريقة لسرد جميع تفاصيل الموظفين * / public void listemployees () {session session = factory.opensession () ؛ المعاملة tx = فارغة ؛ حاول {tx = session.begintransaction () ؛ قائمة الموظفين = session.createquery ("من الموظف"). list () ؛ لـ (iterator iterator1 = amploy.iterator () ؛ iterator1.hasNext () ؛) {efferene efference = (amployee) iterator1.next () ؛ system.out.print ("الاسم الأول:" + efferene.getFirstName ()) ؛ system.out.print ("الاسم الأخير:" + efferene.getLastName ()) ؛ System.out.println ("Salary:" + efferene.getSalary ()) ؛ تعيين الشهادات = exearcee.getCertificates () ؛ لـ (iterator iterator2 = issities.iterator () ؛ iterator2.hasNext () ؛) {certtName = (شهادة) iterator2.next () ؛ System.out.println ("الشهادة:" + certname.getName ()) ؛ }} tx.commit () ؛ } catch (hibernateException e) {if (tx! = null) tx.rollback () ؛ E.PrintStackTrace () ؛ } أخيرًا {session.close () ؛ }} / * طريقة تحديث الراتب للموظف * / public void uptordeMployee (integer amployeeId ، int salary) {session session = factory.opensession () ؛ المعاملة tx = فارغة ؛ حاول {tx = session.begintransaction () ؛ موظف الموظف = (الموظف) جلسة. الموظف. session.update (الموظف) ؛ tx.Commit () ؛ } catch (hibernateException e) {if (tx! = null) tx.rollback () ؛ E.PrintStackTrace () ؛ } أخيرًا {session.close () ؛ }} / * طريقة لحذف موظف من السجلات * / public void deleteemployee (integer efferenceId) {session session = factory.opensession () ؛ المعاملة tx = فارغة ؛ حاول {tx = session.begintransaction () ؛ موظف الموظف = (الموظف) جلسة. Session.delete (موظف) ؛ tx.Commit () ؛ } catch (hibernateException e) {if (tx! = null) tx.rollback () ؛ E.PrintStackTrace () ؛ } أخيرًا {session.close () ؛ }}} تجميع وتنفيذ:
$ Java ManagementEmployee
..... ستعرض رسائل السجل المختلفة هنا ......... الاسم الأول: Manoj الاسم الأخير: كومار الراتب: 4000Certificate: MbacerTificate: PMPCertificate: McAfirst الاسم: الاسم العلاط: kumar الراتب: 5000Certificate: mbacertificate: bafirst الاسم: الاسم الأخير: kumar salary:
إذا قمت بفحص نموذج الموظف والشهادة ، فيجب عليك تسجيله:
MySQL> حدد * من الموظف ؛
+----------------------------+----------+| معرف | first_name | last_name | الراتب |+------------------------------------+------------+----------+| 1 | مانوج | كومار | 5000 |+--------------------------------+---------+صف واحد في المجموعة (0.00 ثانية)
MySQL> حدد * من الشهادة ؛
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------