实际上,并不建议使用联合主键.因为一般复合主键和业务关联比较大,所以不建议使用复合主键,但是针对遗留项目,有存在的价值
对于O/R mapping一般的解决方案都是将联合主键独立出来
例子CodeLibrary
需要重写hashCode()和equals(),这样才能确定唯一值,主键需要实现Serializable
public class CodePk implements Serializable {
/**
*
*/
private static final long serialVersionUID = -2825277620995293886L;
private String codeNo;
private String catalog;
public CodePk() {
super();
}
public String getCodeNo() {
return codeNo;
}
public void setCodeNo(String codeNo) {
this.codeNo = codeNo;
}
public String getCatalog() {
return catalog;
}
public void setCatalog(String catalog) {
this.catalog = catalog;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((catalog == null) ? 0 : catalog.hashCode());
result = prime * result + ((codeNo == null) ? 0 : codeNo.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
CodePk other = (CodePk) obj;
if (catalog == null) {
if (other.catalog != null)
return false;
} else if (!catalog.equals(other.catalog))
return false;
if (codeNo == null) {
if (other.codeNo != null)
return false;
} else if (!codeNo.equals(other.codeNo))
return false;
return true;
}
}
public class CodeLibrary {
private CodePk codepk;
private String itemName;
public CodeLibrary() {
super();
}
public CodePk getCodepk() {
return codepk;
}
public void setCodepk(CodePk codepk) {
this.codepk = codepk;
}
public String getItemName() {
return itemName;
}
public void setItemName(String itemName) {
this.itemName = itemName;
}
}
@Test
public void testSaveCodeLibrary(){
Session session = null;
Transaction tx = null;
try{
session = HibernateUtil.openSession();
tx = session.beginTransaction();
CodePk pk1 = new CodePk();
pk1.setCatalog("Gender");
pk1.setCodeNo("M");
CodeLibrary lib1 = new CodeLibrary();
lib1.setItemName("男");
lib1.setCodepk(pk1);
CodePk pk2 = new CodePk();
pk2.setCatalog("Gender");
pk2.setCodeNo("F");
CodeLibrary lib2 = new CodeLibrary();
lib2.setItemName("女");
lib2.setCodepk(pk2);
session.save(lib1);
session.save(lib2);
tx.commit();
} catch (Exception e){
e.printStackTrace();
tx.rollback();
} finally {
HibernateUtil.close(session);
}
}