使用复合键一对一地休眠

时间:2012-11-01 12:58:53

标签: hibernate mapping one-to-one composite-primary-key

我的映射文件存在问题,与一对一的关系有关,复合主键,其中键的字段名称不匹配。

表1:

<class entity-name="CompPkTest" table="compPkTest" catalog="data" mutable="true" polymorphism="implicit" dynamic-update="false" dynamic-insert="false" select-before-update="false" optimistic-lock="version">
<composite-id mapped="false" unsaved-value="undefined">
  <key-property name="id1" type="int">
    <column name="id1"/>
  </key-property>
  <key-property name="id2" type="int">
    <column name="id2"/>
  </key-property>
</composite-id>
<property name="details" type="string" unique="false" optimistic-lock="true" lazy="false" generated="never">
  <column name="Details" length="500"/>
</property>
<one-to-one name="CompPkTestDetail" entity-name="CompPkTestDetail" constrained="false" embed-xml="true"/>

表2:

<class entity-name="CompPkTestDetail" table="compPkTestDetail" catalog="data" mutable="true" polymorphism="implicit" dynamic-update="false" dynamic-insert="false" select-before-update="false" optimistic-lock="version">
<composite-id mapped="false" unsaved-value="undefined">
  <key-property name="idetail1" type="int">
    <column name="idetail1"/>
  </key-property>
  <key-property name="idetail2" type="int">
    <column name="idetail2"/>
  </key-property>
</composite-id>
<one-to-one name="CompPkTest" entity-name="CompPkTest" constrained="true" embed-xml="true"/>
<property name="someDetail" type="string" unique="false" optimistic-lock="true" lazy="false" generated="never">
  <column name="someDetail" length="300"/>
</property>
<property name="moreDetail" type="string" unique="false" optimistic-lock="true" lazy="false" generated="never">
  <column name="moreDetail" length="300"/>
</property>

问题是当查询表1时,“details”属性为null。 如果我将CompPkTestDetail中的键属性名称更改为id1和id2,(同时保持列名不变),则关系将按预期工作,并且查询将返回“details”的值。

我的问题:

上面的映射xml是否是正确的关联方式(使用不匹配的字段名称)?

hibernate是否正确强制字段名称必须匹配,或者这是一个错误?

请注意,在我的应用程序中没有实体的类,而hibernate处于map模式。我的应用程序可以完全动态访问(任意)数据库,因此映射的xml是在运行时生成的。

1 个答案:

答案 0 :(得分:1)

<class entity-name="CompPkTest" table="compPkTest" >
  <composite-id>
    <key-property name="id1" column="id1"/>
    <key-property name="id2" column="id2"/>
  </composite-id>
  <one-to-one name="CompPkTestDetail" entity-name="CompPkTestDetail" property-ref="Parent"/>
</class>

<class entity-name="CompPkTestDetail" table="compPkTestDetail">
  <composite-id>
    <key-many-to-one name="Parent" entity-name="CompPkTest" >
      <column name="idetail1"/>
      <column name="idetail2"/>
    </key-many-to-one>
  </composite-id>
  <!--maybe needed if property-ref does not find the id property-->
  <property name="Parent" insert="false" update="false">
    <column name="idetail1"/>
    <column name="idetail2"/>
  </property>
</class>

Detail应该对其父级具有正常引用,Master引用它。我不确定你是否必须一对一地将property-ref指定为Parent属性