Question

Je suis de la difficulté à cartographier la structure de base de données suivante (raccourci par souci de concision avec seulement PKs / et quelques FKs colonnes supplémentaires:

Politique

Policy_Id (PK) ...

Risque

Risk_Id (PK) ...

Party

Party_Id (PK) ...

PartyRole

  • PartyRole_Id (PK)
  • Party_Id (FK not-null)
  • Policy_Id (FK)
  • Risk_Id (FK)
  • Party_Role_Type

la table PartyRole peut contenir une ligne qui relie une partie à une politique et / ou d'une ligne qui relie la même partie à un risque. Fondamentalement, il est beaucoup à beaucoup d'autres rejoignent la table mais il combine à la fois à de nombreuses relations beaucoup: Parti <-> Politique et une pour Party <-> Risque. Party_Role_Type peut être soit POLICE ou PARTY et agit efficacement comme un discriminateur pour identifier les relations de la ligne appartient.

J'ai essayé de modéliser cette structure avec 4 entités: Politique, Parti, Risque, PartyRole. Voici les correspondances: 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>

Tous les POJO java sont configurés pour correspondre à cette cartographie et toutes les associations sont configurés correctement lorsque les objets ajoutés ou supprimés dans les collections. La politique est considérée comme une racine globale, donc quand il est sauvé par Hibernate Je veux sauver les parties associées à la politique. Quand j'ajouter une partie à la politique et du risque (et tous les rôles associés) Je reçois l'exception suivante:

Causé par: java.sql.BatchUpdateException: contrainte d'intégrité violation: clé étrangère aucun parent; Table FK_PARTY_ROLE_POLICY: PARTY_ROLE

Quel est le problème? Aussi est-ce la meilleure façon de cartographier cette relation? Y at-il une chance de cartographier cette relation en quelque sorte sans l'utilisation de l'entité intermédiaire? Merci pour tout ce que vous aide.

Était-ce utile?

La solution

Je n'ai pas vraiment eu la chance de revenir à écrire une réponse à cela, mais je l'ai trouvé quel était le problème. La question était dans ces lignes ici:

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

J'ai raté bêtement que la « colonne » spécifiée dans les éléments des sacs pointe vers Policy_Id et Risk_Id, ce qui est incorrect. Il doit être le nom de la clé étrangère colonne qui fait référence à la clé primaire de l'entité où les un à de sacs sont définis. Donc, dans mon cas, il aurait dû être Party_Id et de faire la différence entre les rôles politiques et les rôles du parti, je devais utiliser un « où » constrant sur le sac. Ainsi, les définitions ont fini par ressembler à ceci:

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

Autres conseils

pour moi sons que cela est une erreur générée par votre SGBDR. Alors, essayez de permettre l'enregistrement SQL (hibernate.show_sql = true) et voir ce que Hibernate essaie de faire. Mais je revérifier la structure de table pour PARTY_ROLE, car il semble que les FKs ont été créés avec les contraintes non nulles. Il y a des bases de données (Sybase, IIRC) qui crée les clefs étrangères avec sans nul par défaut. Et, si vous spécifiez la relation comme NULL, il peut essayer de trouver une politique avec le NULL ID, ce qui ne sera certainement pas exister :-)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top