一直以来,用hibernate做多对一时,关联的都是主键,今天,同事设计的表,关联的却不是主键,这下麻烦了,hibernate的many-to-one默认关联的都是主键,原来,hibernate提供了非主键的关联,即只要加一个property-ref即可,注意红色的部分,如:
比如假如:TbLoungeLts 表中有一个字段Lounge_Code对应了表TbLounge中的 非主键lounge_code.
主表:TbLounge写法:主键为:id ,
xml:
<id name="loungeId" type="java.lang.String">
<column name="LOUNGE_ID" length="32" />
<generator class="uuid.hex" />
</id>
<property name="loungeCode" type="java.lang.String">
<column name="LOUNGE_CODE" length="32" not-null="true">
<comment>休息室IP,有效唯一</comment>
</column>
</property>
<set name="tbLoungeLtss" inverse="true" cascade="none" >
<key column="loungeCode" property-ref="loungeCode" />
<one-to-many class="TbLoungeLts" />
</set>
bean文件:
private String loungeCode; // 休息室IP,有效唯一
private Set<TbLoungeLts> tbLoungeLtss = new HashSet<TbLoungeLts>(0); // 关联休息室统计信息
public String getLoungeCode() {
return this.loungeCode;
}
public void setLoungeCode(String loungeCode) {
this.loungeCode = loungeCode;
}
public Set<TbLoungeLts> getTbLoungeLtss() {
return tbLoungeLtss;
}
public void setTbLoungeLtss(Set<TbLoungeLts> tbLoungeLtss) {
this.tbLoungeLtss = tbLoungeLtss;
}
从表:TbLoungeLts表
xml
<property name="loungeCode" type="java.lang.String">
<column name="LOUNGE_CODE" length="32" />
</property>
<many-to-one name="tbLounge" property-ref="loungeCode" class="TbLounge" cascade="all"
insert="false" update="false" lazy="false">
<column name="LOUNGE_CODE" length="32"
not-null="true">
<comment>休息室类型</comment>
</column>
</many-to-one>
bean文件:
//休息室代码
private String loungeCode;
private TbLounge tbLounge;//关联休息室
public TbLounge getTbLounge() {
return tbLounge;
}
public void setTbLounge(TbLounge tbLounge) {
this.tbLounge = tbLounge;
}
public String getLoungeCode() {
return loungeCode;
}
public void setLoungeCode(String loungeCode) {
this.loungeCode = loungeCode;
}
还有个问题,因为我们用从表关联了主表的非主键的字段Lounge_Code ,那么应该保证主表的Lounge_Code唯一的约束,在数据库的TbLounge表中应当配置:lounge_Code 的唯一约束,不允许有重复记录。