在使用hibernate时有时会碰到配置复合主键和使用,例如下面表就是使用了一个复合主键的
那么在配置hibernate文件时就的使用composite-id来标识是复合主键了其部分代码如下:
<composite-id name="id" class="com.targ.adaptoflow.formdesign.form.domain.FormId">
<key-property name="formId" column="formId" type="string" length="40"></key-property>
<key-property name="formVersion" column="formVersion" type="string" length="10"></key-property>
</composite-id>
最主要的是这里边使用FormId类来标识了该主键,该类的代码如下(其实该类也就是重写了equals和hasCode方法
public class FormId implements java.io.Serializable {
private String formId;
private String formVersion;
public FormId() {
// TODO Auto-generated constructor stub
}
public FormId(String formId, String formVersion) {
this.formId = formId;
this.formVersion = formVersion;
}
@Override
public boolean equals(Object obj) {
if(obj == null) return false;
if(!(obj instanceof FormId)) return false;
FormId that = (FormId) obj;
if(that.getFormId().equals(this.getFormId()) && that.getFormVersion().equals(this.getFormVersion())) {
return true;
} else {
return false;
}
}
@Override
public int hashCode() {
return this.getFormId() == null ? 0 : this.getFormId().hashCode() * 37 + this.getFormVersion() == null ? 0 : this.getFormVersion().hashCode() * 37;
}
public String getFormId() {
return formId;
}
public void setFormId(String formId) {
this.formId = formId;
}
public String getFormVersion() {
return formVersion;
}
public void setFormVersion(String formVersion) {
this.formVersion = formVersion;
}
}
):
其他的配置还和以前的规则一样了。
现在就要谈它的应用了,有时候在程序中需要用到复合主键里边的一个字段进行判断那么hql如何下了,我们现在假设需要用到复合主键里的formId进行判断,那么hql语句应该这样写:
写道
String hql =" from Form fm where fm.id.formId = '"+formId+"'";
可以看到在hql可以通过fm.id.formId来访问数据库formId字段
List<FormVO> formList = formDao.getListByHql("select new com.targ.adaptoflow.formdesign.form.vo.FormVO(fm.id , fm.formName ,fm.isCurVersion) from Form as fm where fm.formModelId = '"+formModelId+"' group by fm.id , fm.formName ,fm.isCurVersion order by isCurVersion desc ");
上面里的group by fm.id ,也采用的复合主键,相关的代码可以查看附件看看,希望对大家提供帮助