如何使用复合主键为下表结构编写休眠映射

罗希尼·库玛(Rohini Kumar)

我在为下面的表结构编写休眠映射时遇到困难

Throttle                SAMPLEDATA
-------------          --------------------------------
OBJID  INT(PK)      OBJID | NUM_WHEELS |    NUM_BRAKES
NUM_WHEELS INT         --------------------------------
NUM_BRAKES INT      1234  | 2   |  2
                    1235  | 2   |  2
                    1236  | 2   |  2

NOTCH                   SAMPLEDATA
-------------           ---------------------------------------
THROTTLE_OBJID(PK+FK)INT    THROTTLE_OBJID |POSITION |  SECONDS
POSITION INT(PK)        ---------------------------------------
SECONDS INT         1234  | 1       |  2
                    1234  | 2           |  2
                    1234  | 3       |  2


DYNBRAKE                SAMPLEDATA
-------------           ---------------------------------------
THROTTLE_OBJID(PK+FK)INT    THROTTLE_OBJID |POSITION |  SECONDS
POSITION INT(PK)        ---------------------------------------
SECONDS INT         1235  | 0       |  2
                    1235  | 2       |  2
                    1235  | 4       |  2

NOTCH&DYNBRAKE表具有组合的主键,作为THROTTLE_OBJID和POSITION的组合。我的要求是,每当我从Throttle表中删除一条记录时,都应删除Notch和DynBrake表中的相应引用。

对于这种数据库结构,我的休眠映射如下。

THROTTLE mapping file
=========================

<hibernate-mapping> 
    <class name="Throttle" table="THROTTLE">

        <id name="objId">
            <generator class="sequence">
                <param name="sequence">throttle-seq</param>
            </generator>
        </id>

        <property name="numWheels" type="int" column="NUM_WHEELS" />
        <property name="numBrakes" type="int" column="NUM_BRAKES" />

        <map name="notch" cascade="all" inverse="true">
            <key column="THROTTLE_OBJID"/>
            <index column="POSITION" type="int"/>
            <one-to-many class="Notch"/>
        </map>  

        <map name="dynbrake" cascade="all" inverse="true">
            <key column="THROTTLE_OBJID"/>
            <index column="POSITION" type="int"/>
            <one-to-many class="DynBrake"/>
        </map>  
    </class>
</hibernate-mapping>

NOTCH mapping file
=========================    

<hibernate-mapping>
    <class name="Notch" table="NOTCH">
        <composite-id name="id" 
            class="Order$Id">
        <key-property name="position" column="POSITION" type="int"/>
        <key-one-to-many name="throttleObjId"/>
        </composite-id>
        <many-to-one name="throttleObjId" class="Throttle" column="THROTTLE_OBJID"/>
        <property name="seconds" type="int" column="SECONDS" />                    

    </class>
</hibernate-mapping>

DYNBRAKE mapping file
=========================
<hibernate-mapping>
    <class name="DynBrake" table="DYNBRAKE">
        <composite-id name="id" 
            class="Order$Id">
        <key-property name="position" column="POSITION" type="int"/>
        <key-one-to-many name="throttleObjId"/>
        </composite-id>
        <many-to-one name="throttleObjId" class="Throttle" column="THROTTLE_OBJID"/>
        <property name="seconds" type="int" column="SECONDS" />                    
    </class>
</hibernate-mapping>

通过这种映射配置,我收到“无法为#Notch初始化集合”的异常。我必须维护Throttle.hbm.xml中的代码,因为在应用程序的其他部分中有大量的代码依赖于此映射。所以我不想在这里将集合映射更改为SET或BAG。

在这方面有人可以帮助我吗?

拉迪姆·科勒

NotchDynBrake对象/表的描述中,我建议更改映射。我们不需要将这些对象/实体表示为单独的对象。因为只有复合ID ...带来了很多麻烦。

为此,Hibernate具有composite-element因此,让我们更改Throttle.hbm.xml<map>映射(并抛出其他文件):

 <map name="notch" cascade="all-delete-orphan" inverse="true">
    <key column="THROTTLE_OBJID"/>
    <index column="POSITION" type="int"/>
    //<!--<one-to-many class="Notch"/>-->
    <composite-element class="Notch">
        <parent name="throttleObjId" />
        <property name="seconds" type="int" column="SECONDS" />
    </composite-element>
</map>  

<map name="dynbrake" cascade="all-delete-orphan" inverse="true">
   <key column="THROTTLE_OBJID"/>
   <index column="POSITION" type="int"/>
   //<!--<one-to-many class="DynBrake"/>-->
   <composite-element class="DynBrake">
       <parent name="throttleObjId" />
       <property name="seconds" type="int" column="SECONDS" />
   </composite-element>
</map> 

该模型将保持不变,但是由于Notch和DynBrake的性质,简化了映射。查询将正常工作,插入/更新/删除也是如此。此外,级联更改为all-delete-orphan,这更适合这种情况

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用复合主键为下表结构编写休眠映射

来自分类Dev

休眠复合主键

来自分类Dev

如何从休眠中的复合主键获取自动生成的值

来自分类Dev

JPA 2 Hibernate映射,使用具有3层结构的@IdClass在主键中使用复合键

来自分类Dev

在单个表中的复合外键和主键上休眠一对一映射

来自分类Dev

如何在mybatis映射中定义复合主键

来自分类Dev

如何使用Hibernate Annonations实现复合主键

来自分类Dev

如何使用codeIgniter迁移定义复合主键?

来自分类Dev

如何使用复合主键从表中删除?

来自分类Dev

使用JPA映射复合主键和外键

来自分类Dev

如何使用实体框架核心3.1.1为拥有的实体类型设置复合主键?

来自分类Dev

无主键表的休眠映射

来自分类Dev

休眠-如何使用生成器为参考表创建主键?

来自分类Dev

如何使用复合键映射多对多

来自分类Dev

JPA 复合主键/外键映射

来自分类Dev

如何使用MySQL InnoDB实现auto_increment复合主键?

来自分类Dev

如何使用复合主键从SpringBoot中的MySql检索数据

来自分类Dev

如何使用@Embeddable内部的@GeneratedValue用作复合主键?

来自分类Dev

如何使用MySQL InnoDB实现auto_increment复合主键?

来自分类Dev

如何为下表编写SQL查询?

来自分类Dev

如何为下表编写SQL查询

来自分类Dev

如何为下表编写postgres查询?

来自分类Dev

将复合外键映射到复合主键

来自分类Dev

如何查询复合主键的子集?

来自分类Dev

如何创建复合主键android

来自分类Dev

@SecondaryTable从主表(复合主键)到辅助表(单主键)的映射

来自分类Dev

JAXB如何将复合键字段映射为兄弟

来自分类Dev

如何使用EF Core将单个主键更改为复合主键

来自分类Dev

休眠注释如何生成主键?

Related 相关文章

热门标签

归档