يتطلب تعيين المفتاح الأساسي المركب استخدام علامة <posited-id> في ملف تكوين التعيين. تشير هذه العلامة إلى تحديد فئة كمفتاح أساسي للمركب المقابل. تحتاج سمة اسمها إلى تحديد قيمة الخصائص المحددة في ملف الفئة وإضافة العلامة الفرعية <-property> إلى العلامة.
ملاحظة: إذا كنت ترغب في استخدام التعيين المركب ، فيجب عليك وضع المفتاح الأساسي المركب في فئة واحدة ، أي ، يتم تقسيم سمات المفتاح الأساسي المركبة والسمات الأخرى إلى فئتين ، وتنفذ فئة المفتاح الأساسي المركبة الواجهة المتسلسلة ، والتي تنتمي إلى Java.io.
يتكون المفتاح الأساسي لعلاقة تعيين المفتاح الأساسي المركب من أعمدة متعددة ، وهو ما يتوافق مع جدول البيانات بسيطًا للغاية ، كما هو موضح في الشكل أدناه:
1. ملفات الفصل
هنا نأخذ الجدول في الشكل أعلاه كمثال. في الجدول ، يجمع حقلان وفهمان لتشكيل المفتاح الأساسي للجدول. لذلك ، تتم تسمية الطبقات الجديدة المقسمة fiscalyearperiod و fiscalyearperiodpk على التوالي. من بينها ، تغلف فئة fiscalyearperiod السمات الرئيسية الرئيسية للجدول ، وتغلف فئة FiscalyeArperiod سمات أخرى ، وفئة Fiscalyearperiod.
1.1 fiscalyearperiod.java
يلفت الفئة الخصائص الأساسية ، وتغلف فئة FiscalyeArperiodpk كسمات في الفصل ، وتكوين التعيين المقابل في ملف التكوين ، على النحو التالي:
حزمة com.src.hibernate ؛ استيراد java.sql.date ؛ الطبقة العامة fiscalyearperiod {// الوقت الرئيسي المفتاح الأساسي fiscalyearperiodpk fiscalyearperiodpk ؛ fiscalyearperiodpk getfiscalyearperiodpk () {return fiscalyearperiodpk ؛ } public void setfiscalyearperiodpk (fiscalyearperiodpk fiscalyearperiodpk) {this.fiscalyearperiodpk = fiscalyearperiodpk ؛ } // تاريخ البدء تاريخ خاص. التاريخ العام getBegindate () {return begindate ؛ } public void setBegindate (date begindate) {this.begindate = begindate ؛ } // نهاية تاريخ التاريخ الخاص ؛ التاريخ العام getenddate () {return enddate ؛ } public void setendDate (date enddate) {this.endDate = endDate ؛ } // مرحلة الوقت الدورات الخاصة بالسلسلة الخاصة ؛ السلسلة العامة getPeriodsts () {return distersts ؛ } public void setPeriOdsts (string diertsts) {this.periodsts = disterSts ؛ }} 1.2 fiscalyearperiodpk.java
تغليف سمة المفتاح الأساسي. يتم فصل هذه الفئة عن فئة FiscalyeArperiod. أنه يحتوي على سمات المفتاح الأساسي الأساسي ويحتاج إلى تنفيذ الواجهة التسلسلية. يجب تعيين هذه الفئة إلى علامة <posited-id> في ملف التكوين لتحديد الفئة. الرمز كما يلي:
حزمة com.src.hibernate ؛ استيراد java.io.serializable ؛ الطبقة العامة fiscalyearperiodpk تنفذ قابلة للتسلسل {// السنة الخاصة int fiscalyear ؛ public int getFiscalyear () {return fiscalyear ؛ } public void setFiscalyear (int fiscalyear) {this.fiscalyear = fiscalyear ؛ } // مدة private int fiscalperiod ؛ public int getfiscalperiod () {return fiscalperiod ؛ } public void setfiscalperiod (int fiscalperiod) {this.fiscalperiod = fiscalperiod ؛ }} 2. ملف التكوين
فيما يلي سؤال أي من الفئتين تحتاج إلى إضافة ملفات تعيين؟ نظرًا لاستخدام علامة <posited-id> ، تحتاج فقط إلى إضافة تعيين لفئة FiscalyeArperiod ، وأضف علامة المفتاح الأساسي المركب المقابل إلى ملف التعيين ، وإضافة سمات المفتاح الأساسي المقابل إلى العلامة ، على النحو التالي:
<؟ table = "t_fiscal_year_period_pk"> <composite-id name = "fiscalyearpk"> <key-property name = "fiscalyear"> </key-property> <key-property name = "fiscalperi"> </key-property> </composite-id> type = "date"/> <property name = "enddate" type = "date"/> <property name = "disterSts"/> </slass> </ hibernate mapping>
يتم إنشاء الملف أعلاه لإنشاء جدول قاعدة البيانات المقابل ، وبيان SQL الذي تم إنشاؤه كما يلي:
جدول إسقاط إذا كان موجودًا t_fiscal_year_period_pk إنشاء جدول t_fiscal_year_period_pk (fiscalyear integer not null ، fiscalperiod integer not null ، legning date ، enddate ،
هيكل الجدول المقابل على النحو التالي:
3. تشغيل البيانات
بعد تكوين ملف التعيين المقابل ، تصبح عملية البيانات المقابلة بسيطة للغاية. أولاً ، ابدأ بكتابة البيانات. عند كتابة البيانات إلى قاعدة البيانات ، سيتم كتابة فئتين إلى قاعدة البيانات في نفس الوقت. لذلك ، يجب تحويل كلا الفئتين إلى حالة عابرة. لذلك ، عند حفظها ، تحتاج أولاً إلى حفظ كائن FiscalyeArperiod إلى قاعدة البيانات أولاً ، ثم ستقوم تلقائيًا بربط السمات المركبة وحفظ المعلومات في قاعدة البيانات.
3.1 اكتب العملية
طريقة عملية الكتابة هي نفس طريقة الكتابة السابقة. تحتاج إلى تحديد كائنين ثم حفظ معلومات الكائن المقابلة في قاعدة البيانات. الرمز كما يلي:
public void testSave1 () {// إعلان جلسة كائن الجلسة = null ؛ حاول {// الحصول على جلسة كائن الجلسة = hibernateutils.getSession () ؛ // فتح الجلسة. begintransaction () ؛ // إنشاء الكائن المركب fiscalyearperiodpk fiscalyearperiodpk = جديد fiscalyearperiodpk () ؛ fiscalyearperiodpk.setfiscalperiod (2014) ؛ fiscalyearperiodpk.setfiscalyearyear (2012) ؛ // إنشاء الكائن fiscalyearperiod fiscalyearperiod = جديد fiscalyearperiod () ؛ fiscalyearperiod.setfiscalyearperiodpk (fiscalyearperiodpk) ؛ Session.save (fiscalyearperiod) ؛ // Sump Session Session.getTransaction (). Commit () ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ Session.getTransaction (). Rollback () ؛ } أخيرًا {hibernateUtils.Closedessesse (الجلسة) ؛ }}تنفيذ طريقة الاختبار المقابلة ، وبيان SQL الذي تم إنشاؤه هو كما يلي:
Hibernate: insert into t_fiscal_year_period_pk (beginDate, endDate, periodSts, fiscalYear, fiscalPeriod) values (?, ?, ?, ?, ?) عرض قاعدة البيانات المقابلة:
3.2 عملية التحميل
ستكون طريقة التحميل المقابلة مختلفة عن السابق ، لأن المفتاح الأساسي في الجدول هو خاصية مركب ، لذلك يجب إنشاء فئة. عند تحميل البيانات ، تحتاج إلى إنشاء كائن مفتاح أساسي. في هذا الوقت ، يكون المفتاح الأساسي هو كائن ، وتحتاج إلى تعيين قيم لخصائص الكائن للحصول على الكائن. الرمز كما يلي:
public void testload1 () {// إعلان جلسة جلسة كائن الجلسة = null ؛ حاول {// الحصول على جلسة كائن الجلسة = hibernateutils.getSession () ؛ // فتح الجلسة. begintransaction () ؛ // إنشاء الكائن المركب fiscalyearperiodpk fiscalyearperiodpk = جديد fiscalyearperiodpk () ؛ fiscalyearperiodpk.setfiscalperiod (2014) ؛ fiscalyearperiodpk.setfiscalyear (2012) ؛ fiscalyearperiod fiscalyearperiod = (fiscalyearperiod) session.load (fiscalyearperiod.class ، fiscalyearperiodpk) ؛ System.out.println ("تاريخ البدء:"+fiscalyearperiod.getBegindate ()) ؛ // sump session.getTransaction (). commice () ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ Session.getTransaction (). Rollback () ؛ } أخيرًا {hibernateUtils.Closedessesse (الجلسة) ؛ }}النتيجة على النحو التالي:
Hibernate: SELECT FISCALYEAR0_.FISCADYER AS FISCALYEAR0_0_ ، FISCALYEAR0_.FISCALPERIOD AS FISCALPE2_0_0_ ، FISCALYEAR0_.BEGINDATE AS BEGNINDATE0_0_ ، FISCALYEAR0_.ENDDATE AS ENDDATE0_ ، t_fiscal_year_period_pk fiscalyear0_ حيث fiscalyear0_.fiscalyear =؟ و fiscalyear0_.fiscalperiod =؟ تاريخ البدء: 2013-10-12
4. أمثلة شاملة
يتكون جدول قسم لشركة أكبر (Hibernate_Dept_compositepk) من حقول مثل المنطقة (المنطقة) واسم القسم (الاسم) وعدد الأشخاص في القسم (EMPCOUNT) ووقت التأسيس (عيد ميلاد). نستخدم اسم المنطقة واسم القسم كمفتاح أساسي مشترك:
4.1 فئة الهدف: Department.java
قسم الفئة العامة { /** ملخص سمة الجمعية الرئيسية الرئيسية واكتبها في فئة بشكل منفصل* / / /منطقة السلسلة الخاصة ؛ // اسم السلسلة الخاصة ؛ / ** إعداد كائن الفئة الرئيسية الرئيسية كمتغير عضو*/ قسم PrivatePK DepartmentPK ؛ خاص int empcount ؛ عيد ميلاد التاريخ الخاص // public string getarea () {// return area ؛ //} // // public void setarea (string area) {// this.area = area ؛ //} // // public string getName () {// return name ؛ //} // // public void setName (اسم السلسلة) {// this.name = name ؛ //} public int getempcount () {return empcount ؛ } public void setempcount (int empcount) {this.empcount = empcount ؛ } التاريخ العام getBirthday () {return Birthday ؛ } public void setbirthday (Date Birthday) {this.birthday = عيد ميلاد ؛ } DepartmentPK getDepartmentPK () {return DepartmentPK ؛ } public void setDepartmentPK (DepartmentPK DepartmentPK) {this.departmentPK = DepartmentPK ؛ }} 4.2 فئة المفتاح الأساسي: DepartmentPK.Java
الطبقة العامة DepartmentPK تنفذ Serializable {Private Static Final Long SerialVersionuid = -288002855915204255L ؛ منطقة سلسلة خاصة ؛ اسم السلسلة الخاصة ؛ /** * طريقة HashCode في الكتابة (تم الحكم عليها على أساس المنطقة والاسم) *///@Override Public int hashcode () {Final int prime = 31 ؛ int النتيجة = 1 ؛ النتيجة = prime * النتيجة + ((المنطقة == null)؟ 0: area.hashCode ()) ؛ النتيجة = prime * result + ((name == null)؟ 0: name.hashCode ()) ؛ نتيجة العودة } / ** * الكتابة فوق المساواة (يتم الحكم عليها على أساس المنطقة والاسم) * / Override public boolean يساوي (Object OBJ) {if (this == obj) return true ؛ إذا (OBJ == NULL) عودة خطأ ؛ if (getClass ()! = obj.getClass ()) return false ؛ Final DepartmentPK Other = (DepartmentPK) OBJ ؛ if (area == null) {if (other.area! = null) return false ؛ } آخر إذا (! area.equals (other.area)) return false ؛ if (name == null) {if (other.name! = null) return false ؛ } آخر إذا (! name.equals (other.name)) إرجاع خطأ ؛ العودة صحيح. } السلسلة العامة getarea () {منطقة العودة ؛ } public void setarea (string area) {this.area = area ؛ } السلسلة العامة getName () {return name ؛ } public void setName (اسم السلسلة) {this.name = name ؛ }} 4.3 رسم الخرائط Department.hbm.xml
<؟ name = "com.yangfei.hibernate.compositepk.entity.department" table = "hibernate_dept_compositepk"> <! /> < /composite-id> <!-خصائص أخرى-> <property name = "empcount" length = "4" /> <property name = "birthday" type = "date" /> </slass> </ hibernate mapping>
4.4 ملف تكوين Hibernate hibernate.cfg.xml
<؟ أدوات. -> <hibernate-configuration> <session-factory> <property name = "Dialect"> org.hibernate.dialect.oracle9dialect </property> <property name = "connection.url"> jdbc: oracle: thin:@127.0.0.1: 1521: orcl10 </spertar name = "connection.password"> yf123 </property> <property name = "connection.driver_class"> oracle.jdbc.driver.oracledriver </property> <property name = "hibernate.show_sql"> true </property> </hibernate-configuration>
4.5 فئة الاختبار: Department.Java
يمتد قسم الفئة العامة TestCase { / *** اختبار إدراج بيانات* / public void save () {Session Session = hibernateutils.getSession () ؛ المعاملة t = session.begintransaction () ؛ حاول {Department Dept = New Department () ؛ / ** إنشاء كائن المفتاح الأساسي*/ DepartmentPK deptpk = new DepartmentPK () ؛ deptpk.setarea ("beijing") ؛ Deptpk.setName ("R & D Department") ؛ Dept.SetDepartmentPK (deptpk) ؛ Dept.SetempCount (100) ؛ Dept.SetBirthDay (Date ()) ؛ Session.save (Dept) ؛ T.Commit () ؛ } catch (hibernateException e) {e.printStackTrace () ؛ T.Rollback () ؛ } أخيرًا {hibernateUtils.Closedessesse (الجلسة) ؛ }} / *** اختبار بيانات تحميل* / public void load () {Session Session = hibernateutils.getSession () ؛ المعاملة t = session.begintransaction () ؛ حاول { / ** إنشاء كائن المفتاح الأساسي* / departmentpk deptpk = new DepartmentPk () ؛ deptpk.setarea ("beijing") ؛ Deptpk.setName ("R & D Department") ؛ قسم القسم = (القسم) session.load (Department.class ، deptpk) ؛ System.out.println (dept.getDepartmentPk (). getarea ()+"،"+dept.getDepartmentPK (). } catch (hibernateException e) {e.printStackTrace () ؛ T.Rollback () ؛ } أخيرًا {hibernateUtils.Closedessesse (الجلسة) ؛ }} / *** اختبار بيانات التعديل* / public void update () {Session Session = hibernateutils.getSession () ؛ المعاملة t = session.begintransaction () ؛ حاول { / ** إنشاء كائن المفتاح الأساسي* / departmentpk deptpk = new DepartmentPk () ؛ deptpk.setarea ("beijing") ؛ Deptpk.setName ("R & D Department") ؛ Department EMP = (Department) Session.load (Department.class ، deptpk) ؛ System.out.println (emp.getDepartmentPk (). getarea ()+"،"+emp.getDepartmentPK (). getName ()+"،"+emp.getempcount ()+"،" Emp.SetempCount (100) ؛ Session.SaveorUpDate (EMP) ؛ / ** إنشاء كائن المفتاح الأساسي*/ DepartmentPK deptpk2 = New DepartmentPk () ؛ deptpk2.setarea ("beijing") ؛ Deptpk2.setName ("R & D Department") ؛ قسم القسم = (القسم) session.load (Department.class ، deptpk2) ؛ System.out.println (dept.getDepartmentPk (). getarea ()+"،"+dept.getDepartmentPK (). T.Commit () ؛ } catch (hibernateException e) {e.printStackTrace () ؛ T.Rollback () ؛ } أخيرًا {hibernateUtils.Closedessesse (الجلسة) ؛ }} / *** اختبار حذف البيانات* / public void delete () {جلسة الجلسة = hibernateutils.getSession () ؛ المعاملة t = session.begintransaction () ؛ حاول { / ** إنشاء كائن المفتاح الأساسي* / departmentpk deptpk = new DepartmentPk () ؛ deptpk.setarea ("beijing") ؛ Deptpk.setName ("R & D Department") ؛ قسم القسم = (القسم) session.load (Department.class ، deptpk) ؛ Session.Delete (Dept) ؛ T.Commit () ؛ } catch (hibernateException e) {e.printStackTrace () ؛ T.Rollback () ؛ } أخيرًا {hibernateUtils.Closedessesse (الجلسة) ؛ }}}