在学hibernate的时候一直以为外键值是需要自己设置的(没想到是默认关联主键!!!!)
为此我在这里纠结了很久,以为需要在实体类中添加一个外键字段,手动存入外键值(囧)。
既然hibernate是外键默认关联主键,那么我们如果要关联非主键值该怎么做呢?
其实很简单,只需要在多的一方用 property-ref=“你所关联的字段名”。例如:
Broker.hbm.xml
..........
<hibernate-mapping package="com.crb2b.data.bo">
<class name="Broker" table="crb2b_broker" >
<id name="brokId" type="java.lang.Integer">
<column name="brokId" />
<generator class="native"></generator>
</id>
<property name="brokMemberSid" type="java.lang.String">
<column name="brokMemberSid" length="11" not-null="true" />
</property>
<set name="crb2bListcommons" lazy="false" inverse="true" cascade="all">
<key>
<column name="listMemberSid" length="11" not-null="true" />
</key>
<one-to-many class="ListCommon" />
</set>
ListCommon.hbm.xml:
<hibernate-mapping package="com.crb2b.data.bo">
<class name="ListCommon" table="crb2b_listcommon" >
<id name="licoId" type="java.lang.Integer">
<column name="licoId" />
<generator class="native"></generator>
</id>
<many-to-one name="crb2bBroker" class="Broker" fetch="select" property-ref="brokMemberSid">
<column name="listMemberSid" length="11" not-null="true" />
</many-to-one>
当referencedColumnName关联到非主键列的时候,关联的目标类必须实现Serializable,还要注意的是所映射的属性对应单个列(否则映射无效).