Java Hibernate以一对多的方式将外键加倍

Java Hibernate以一对多的方式将外键加倍,java,mysql,hibernate,Java,Mysql,Hibernate,例如,我有父实体名为parent,它扩展了Base实体,还有子实体名为children,父实体中有一对多的关系,意思是Set,但在children中,父实体被描述为Base,因此,hibernate在子表中创建了两个外键,但最烦人的是-其中一个是DELETE-CASCADE,另一个不是,这会在我试图删除父项时导致错误,我如何才能拥有一个外键(在子项中没有与父项严格相关的父项),或者至少在不删除级联的情况下修复违反密钥的问题? 代码(不是全部,只是相对的): Base.hbm.xml: <c

例如,我有父实体名为
parent
,它扩展了
Base
实体,还有子实体名为
children
,父实体中有一对多的关系,意思是
Set
,但在
children
中,父实体被描述为
Base
,因此,hibernate在子表中创建了两个外键,但最烦人的是-其中一个是DELETE-CASCADE,另一个不是,这会在我试图删除父项时导致错误,我如何才能拥有一个外键(在
子项中没有与父项严格相关的
父项
),或者至少在不删除级联的情况下修复违反密钥的问题?

代码(不是全部,只是相对的)

Base.hbm.xml:

<class name="Base" table="controls">
    <id name="id">
    <subclass name="Parent" discriminator-value="Parent">
         <set name="items" cascade="save-update, delete-orphan" order-by="orderNumber asc" lazy="false" inverse="true" sort="natural">
             <key column="controlId" on-delete="cascade"/>
             <one-to-many class="children"/>
         </set>
     </subclass>
</class>
<class name="Base" table="controls">
    <id name="id">
    <subclass name="Parent" discriminator-value="Parent">
         <set name="items" cascade="save-update, delete-orphan" order-by="orderNumber asc" lazy="false" sort="natural">
             <key column="controlId"/>
             <one-to-many class="children"/>
         </set>
     </subclass>
</class>
错误:

    Cannot delete or update a parent row: a foreign key constraint fails 
(`db_cofp`.`children`, CONSTRAINT `FK3534269CB50AD2C` FOREIGN KEY (`controlId`) 
REFERENCES `controls` (`id`))
显示创建表: *只是相对结束

KEY `FK3534269CC41202F7` (`controlId`),
KEY `FK3534269CB50AD2C` (`controlId`),
CONSTRAINT `FK3534269CB50AD2C` FOREIGN KEY (`controlId`) REFERENCES `controls` (`id`),
CONSTRAINT `FK3534269CC41202F7` FOREIGN KEY (`controlId`) REFERENCES `controls` (`id`) ON DELETE CASCADE

希望我展示了所有重要的东西,注意,
Base
Children
用id扩展了BasicEntity类,并没有编写它,因为它只有
int id
和getter和setters

,通过重写映射解决了这个问题:

Base.hbm.xml:

<class name="Base" table="controls">
    <id name="id">
    <subclass name="Parent" discriminator-value="Parent">
         <set name="items" cascade="save-update, delete-orphan" order-by="orderNumber asc" lazy="false" inverse="true" sort="natural">
             <key column="controlId" on-delete="cascade"/>
             <one-to-many class="children"/>
         </set>
     </subclass>
</class>
<class name="Base" table="controls">
    <id name="id">
    <subclass name="Parent" discriminator-value="Parent">
         <set name="items" cascade="save-update, delete-orphan" order-by="orderNumber asc" lazy="false" sort="natural">
             <key column="controlId"/>
             <one-to-many class="children"/>
         </set>
     </subclass>
</class>

Children.hbm.xml:

<class name="controls.FAQItem" table="faq_item">
     <id name="id">
         <generator class="native"/>
      </id>
      <many-to-one name="base" column="controlId"/>
</class>
<class name="controls.FAQItem" table="faq_item">
     <id name="id">
         <generator class="native"/>
      </id>
      <many-to-one name="base" column="controlId" class="Parent"/>
</class>

我知道我可以删除另一个键,一切都会正常工作,但我想这不是正确的方法