我很难映射以下数据库结构(仅用PKS/FKS和一些额外的列而缩短了简洁的缩短:

政策

Policy_id(PK)...

风险

风险_id(PK)...

聚会

Party_id(PK)...

派对环

  • Partyrole_id(PK)
  • party_id(fk not-null)
  • policy_id(fk)
  • 风险_id(fk)
  • party_role_type

因此,派对状态表可以包含将一方链接到政策和/或将同一方与风险联系起来的行的行。基本上,这是许多与许多联合桌子的联系,但它将许多关系与许多关系结合在一起:政党<->政策,而一方<->风险。 Party_role_type可以是政策或政党,并有效地充当鉴别该行属于哪个关系的歧视者。

我试图用一个4个实体对此结构进行建模:政策,政党,风险,派对环境。这是映射:代码:

<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

怎么了?这也是映射这种关系的最佳方法吗?有机会以某种方式映射这种关系 没有 中间实体的使用?感谢您的帮助。

有帮助吗?

解决方案

我真的没有机会回到写这个答案,但是我发现问题所在。这个问题在这里:

<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 and危险_id,这是不正确的。它应该是 外键 引用的列 首要的关键 定义一对多袋子的实体。因此,就我而言,它应该是party_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),看看Hibernate试图做什么。但是我会仔细检查party_role的表结构,因为似乎FKS是使用不编号的约束创建的。默认情况下,有一些数据库(SYBASE,IIRC)用无编号创建FKS。而且,如果将关系指定为null,它可能会尝试找到具有ID NULL的策略,肯定不会存在:-)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top