在使用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语句应该这样写:
可以看到在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 ,也采用的复合主键,相关的代码可以查看附件看看,希望对大家提供帮助