سؤال

أواجه صعوبة في رسم خرائط بنية قاعدة البيانات التالية (تم اختصارها للإيجاز مع PKS/FKS فقط وبعض الأعمدة الإضافية:

سياسة

Policy_id (PK) ...

مخاطرة

Risk_id (PK) ...

حزب، حفلة

party_id (PK) ...

partyrole

  • partyrole_id (PK)
  • party_id (fk not-null)
  • Policy_id (FK)
  • Risk_id (FK)
  • party_role_type

لذلك يمكن أن يحتوي جدول Partyrole على صف يربط طرفًا بسياسة و/أو صف يربط نفس الطرف بمخاطرة. في الأساس ، يعد الأمر كثير من الجدول للانضمام ، لكنه يجمع بين العديد من العلاقات العديدة: سياسة الحزب <-> وواحد للمخاطر <-> الطرف. يمكن أن يكون party_role_type إما سياسة أو طرف ويعمل بشكل فعال كمواصف لتحديد العلاقة التي ينتمي إليها الصف.

لقد حاولت نمذجة هذا الهيكل مع 4 كيانات: السياسة ، الطرف ، المخاطر ، partyrole. فيما يلي التعيينات: الرمز:

<class name="com.blah.Party" table="Party">

    <id column="Party_Id" name="_id" type="int" unsaved-value="-1" access="field">
      <generator class="sequence">
        <param name="sequence">SQ_Party</param>
      </generator>
    </id>

    <bag name="_policyRoles" access="field" table="Party_Role">
      <key column="Policy_Id" />
      <one-to-many class="com.blah.PartyRole" />
    </bag>

    <bag name="_riskRoles" access="field" table="Party_Role">
      <key column="Risk_Id" />
      <one-to-many class="com.blah.PartyRole" />
    </bag>

  </class>

  <class name="com.blah.Risk" table="Risk">

    <id column="Risk_Id" name="_id" type="int" unsaved-value="-1" access="field">
      <generator class="sequence">
        <param name="sequence">SQ_Risk</param>
      </generator>
    </id>

    <bag name="_partyRoles" access="field">
      <key column="Risk_Id" />
      <one-to-many class="com.blah.PartyRole" />
    </bag>

  </class>

  <class name="com.blah.Policy" table="Policy">

    <id column="Policy_Id" name="_id" type="int" unsaved-value="-1" access="field">
      <generator class="sequence">
        <param name="sequence">SQ_Policy</param>
      </generator>
    </id>

    <bag name="_partyRoles" inverse="true" cascade="save-update" access="field" table="Party_Role" >
      <key column="Policy_Id" />
      <one-to-many class="au.com.cgu.harvest.domain.party.PartyRole" />
    </bag>

  </class>

<class name="au.com.cgu.harvest.domain.party.PartyRole" table="Party_Role" schema="Harvest">

    <id column="Party_Role_Id" name="_id" type="int" unsaved-value="-1" access="field">
      <generator class="sequence">
        <param name="sequence">Harvest.SQ_Party_Role</param>
      </generator>
    </id>

    <property name="partyRoleType" column="PARTY_ROLE_TYPE"
      type="java.lang.String" />

    <many-to-one name="_party" column="Party_Id" class="com.blah.Party" access="field" cascade="save-update" fetch="join" />

    <many-to-one name="_risk" column="Risk_Id" class="com.blah.Risk" access="field" />

    <many-to-one name="_policy" column="Policy_Id" class="com.blah.Policy" access="field" />

  </class>

يتم إعداد جميع Java Pojos لمطابقة هذا التعيين ويتم إعداد جميع الجمعيات بشكل صحيح عند إضافة الكائنات أو حذفها في المجموعات. تعتبر السياسة جذرًا إجماليًا ، لذلك عندما يتم حفظه بواسطة السبات ، أريد أن أحفظ الأطراف المرتبطة بالسياسة. عندما أضيف طرفًا إلى السياسة والمخاطر (وجميع الأدوار المرتبطة) أحصل على الاستثناء التالي:

سبب: java.sql.batchupdateException: انتهاك قيود النزاهة: مفتاح خارجي لا أحد الوالدين ؛ جدول fk_party_role_policy: party_role

ما المشكله؟ هل هذه هي أفضل طريقة لرسم خريطة هذه العلاقة؟ هل هناك فرصة لتعيين هذه العلاقة بطريقة ما بدون استخدام الكيان المتوسط؟ شكرا على كل ما تساعده.

هل كانت مفيدة؟

المحلول

لم أحصل على فرصة للعودة إلى كتابة إجابة على هذا ، لكنني وجدت ما هي المشكلة. كانت القضية في هذه الخطوط هنا:

<bag name="_policyRoles" access="field" table="Party_Role">
  <key column="Policy_Id" />
  <one-to-many class="com.blah.PartyRole" />
</bag>

<bag name="_riskRoles" access="field" table="Party_Role">
  <key column="Risk_Id" />
  <one-to-many class="com.blah.PartyRole" />
</bag>

لقد فاتني بغباء أن "العمود" المحدد في عناصر الحقائب يشير إلى Policy_id و Risk_id ، وهو أمر غير صحيح. يجب أن يكون اسم مفتاح غريب العمود الذي يشير إلى المفتاح الأساسي من الكيان الذي يتم فيه تعريف الحقائب الواحدة. لذلك في حالتي ، كان ينبغي أن يكون الأمر كذلك وللتفرق بين أدوار السياسة وأدوار الحزب ، اضطررت إلى استخدام "حيث" بنية على الحقيبة. لذا انتهى الأمر بالتعريفات مثل هذا:

<bag name="_policyRoles" access="field" table="Party_Role" where="Party_Role_Type = 'POLICY'">
  <key column="Party_Id" />
  <one-to-many class="com.blah.PartyRole" />
</bag>

<bag name="_riskRoles" access="field" table="Party_Role" where="Party_Role_Type = 'RISK'">
  <key column="Party_Id" />
  <one-to-many class="com.blah.PartyRole" />
</bag>

نصائح أخرى

يبدو لي أن هذا خطأ تم إنشاؤه بواسطة RDBMS الخاص بك. لذا ، حاول تمكين تسجيل SQL (hibernate.show_sql = true) ومعرفة ما تحاول السبات. لكنني سأقوم بفحص بنية الجدول لـ Party_role ، حيث يبدو أن FKS تم إنشاؤها مع قيود غير مطلقة. هناك بعض قواعد البيانات (Sybase ، IIRC) التي تنشئ FKS مع عدم الفكرة بشكل افتراضي. وإذا حددت العلاقة على أنها خالية ، فقد تحاول إيجاد سياسة مع المعرف الفارغ ، وهو ما لا يوجد بالتأكيد :-)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top