Frage

Ich habe Probleme beim Abbilden der folgenden Datenbankstruktur (verkürzt der Kürze halber mit nur PKs / FKs und ein paar zusätzlichen Spalten:

Politik

policy_id (PK) ...

Risiko

Risk_Id (PK) ...

Party

PARTY_ID (PK) ...

PartyRole

  • PartyRole_Id (PK)
  • PARTY_ID (FK nicht-null)
  • policy_id (FK)
  • Risk_Id (FK)
  • Party_Role_Type

So ist die PartyRole Tabelle eine Zeile, dass Links Partei eine Politik und / oder eine Zeile, dass Links die gleiche Partei zu einem Risiko enthalten. Im Grunde ist es ein viel zu viele Tisch sitzen, aber es verbindet beide viele zu viele Beziehungen: Party <-> Politik und eine für Partei <-> Risiko. Party_Role_Type kann entweder POLITIK oder Partei sein und wirkt effektiv als Diskriminator zu identifizieren, welche Beziehung die Zeile gehört.

Ich habe versucht, diese Struktur mit einer 4 Einheiten zu modellieren: Politik, Partei, Risiko, PartyRole. Hier sind die Zuordnungen: Code:

<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>

Alle Java POJOs sind Setup diese Zuordnung entsprechen und alle Verbände sind richtig eingerichtet, wenn in einer Sammlung hinzugefügt oder gelöscht Objekte. Politik ist ein Aggregat Wurzel betrachtet, so dass, wenn es durch den Ruhezustand gespeichert Ich mag die Parteien mit dem Policy zugeordnet speichern. Wenn ich eine Vertragspartei die Politik und Risiko wird (und alle zugehörigen Rollen) ich die folgende Ausnahme erhalten:

Verursacht durch: java.sql.BatchUpdateException: Integrität Einschränkungsverletzung: Fremdschlüssel kein Elternteil; FK_PARTY_ROLE_POLICY Tabelle: PARTY_ROLE

Was ist falsch? Auch dies ist der beste Weg, diese Beziehung zu kartieren? Gibt es eine Möglichkeit, diese Beziehung zu kartieren irgendwie ohne die Verwendung der Zwischeninstanz? Vielen Dank für alles, was Sie Hilfe.

War es hilfreich?

Lösung

Ich habe nicht wirklich eine Chance zu schreiben, eine Antwort auf diese zurück zu bekommen, aber ich fand, was das Problem war. Das Problem war in diesen Zeilen hier:

<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>

Ich vermisste dummerweise, dass die „Spalte“ angegeben in den Elementen der Taschen zeigt auf policy_id und Risk_Id, was falsch ist. Es sollte der Name der Fremdschlüssel Spalte, verweist auf die Primärschlüssel des Unternehmens, wo die Eins-zu-viele Taschen definiert sind. Also in meinem Fall sollte es PARTY_ID gewesen sein und zwischen dem politischen Rollen und Partei Rollen zu unterscheiden, hatte ich auf der Tasche ein „where“ constrant zu verwenden. So sind die Definitionen, die wie das endete:

<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>

Andere Tipps

Sounds zu mir, dass dies ein Fehler von Ihrem RDBMS erzeugt. Also, versuchen Sie die SQL-Protokollierung (hibernate.show_sql = true) zu aktivieren und sehen, was Hibernate zu tun versucht. Aber ich würde die Tabellenstruktur für PARTY_ROLE doppelt, wie es scheint, dass der FKS mit nicht-Null-Einschränkungen erstellt wurde. Es gibt einige Datenbanken (Sybase, IIRC), die die FKs mit nicht-Null standardmäßig erstellt. Und wenn Sie die Beziehung als NULL angeben, kann es versuchen, eine Richtlinie mit der ID NULL zu finden, die sicherlich nicht :-) existieren

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top