У меня проблемы с отображением следующей структуры базы данных (для краткости сокращено только с PK / FK и несколькими дополнительными столбцами:
Политика
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 <->, так и политика «Party <-> Risk». Party_Role_Type может быть либо POLICY, либо PARTY и эффективно действовать как дискриминатор для определения того, к какому отношению относится строка.
Я пытался смоделировать эту структуру с 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 настроены для соответствия этому отображению, и все ассоциации настроены правильно, когда объекты добавляются или удаляются в коллекциях. Политика считается совокупным корнем, поэтому при ее сохранении в Hibernate я хочу сохранить стороны, связанные с этой политикой. Когда я добавляю сторону в политику и риск (и все связанные роли), я получаю следующее исключение:
Причина: java.sql.BatchUpdateException: нарушение ограничения целостности: внешний ключ отсутствует родительский; Таблица FK_PARTY_ROLE_POLICY: PARTY_ROLE
Что не так? И это лучший способ отобразить эти отношения? Есть ли шанс как-то сопоставить эти отношения без использования промежуточного объекта? Спасибо за помощь.