我在为下表结构编写hibernate映射时遇到了困难
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&组合的复合主键。的位置。 我的要求是,每当我从Throttle表中删除一条记录时,Notch和DynBrake表中的相应引用都应该被删除。
对于这个DB结构,我的hibernate映射如下所示。
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>
使用此映射配置,我得到“Collection无法初始化#Notch”异常。 我必须在Throttle.hbm.xml中维护,因为在应用程序的其他部分中有大量依赖于此映射的代码。所以我不想在这里将集合映射更改为SET或BAG。
在这方面,有人可以帮助我。
答案 0 :(得分:1)
从Notch
&amp;的描述中DynBrake
个对象/表,我建议更改映射。我们不需要将这些对象/实体表示为分离的对象。因为只有复合身份......它带来了很多麻烦。
出于这些目的,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 ,这更符合此方案