第一次寫博客,只想把工作中遇到的問題記下來。
最近做了一個二次開發的改造,改完之后被告知數據表主鍵根據需求需要用復合主鍵,因為本人菜鳥一枚,復合主鍵從未用過,只能靠度娘
網上給出的復合主鍵映射大致就兩種
第一種:將復合主鍵對應的屬性與實體其他普通屬性放在一起
/*實體類.復合主鍵必須實現Serialzable接口*/ public class User implements Serialzable { private static final long serialVersionUID=1L;//版本之間的兼容,數值自己定義 private String id; private String name; private int age; public User() { } public String getId() { return id; } public void setId(String id) { this.id=id; } public String getName() { return name; } public void setName(String name) { this.name=name; } public int getAge() { return age; } public void setAge(int age) { this.age=age; } public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((id == null) ? 0 : id.hashCode()); result = prime * result + ((name == null) ? 0 : name.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; People other = (People) obj; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } }
注意:復合主鍵實體類需要重寫hashCode()和equals()方法
User..hbm.xml;
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > <hibernate-mapping package="com"> <class name="User" table="USER" > <meta attribute="sync-DAO">true</meta> <composite-id > <key-property name="id" column="id" type="string"></key-property> <key-property name="name" column="name" type="string"></key-property> </composite-id> <property name="age" column="Age" type="int" /> </class> </hibernate-mapping>
第二種方式:將主鍵屬性提取到一個主鍵類中,實體類只需要包涵主鍵類的一個引用
/*主鍵類*/ public class UserPK implements Serializable { private String name; private String id; public String getId() { return id; } public void setId() { this.id=id; } public String getName() { return name; } public void setName() { this.name=name; } public boolean equals (Object obj) { if (null == obj) return false; if (!(obj instanceof com.huateng.po.UserPK )) return false; else { com.huateng.po.UserPK mObj = (com.huateng.po.UserPK ) obj; if (null != this.getId() && null != mObj.getId()) { if (!this.getId().equals(mObj.getId())) { return false; } } else { return false; } if (null != this.getName() && null != mObj.getName()) { if (!this.getName().equals(mObj.getName())) { return false; } } else { return false; } return true; } } public int hashCode () { if (Integer.MIN_VALUE == this.hashCode) { StringBuilder sb = new StringBuilder(); if (null != this.getId()) { sb.append(this.getId().hashCode()); sb.append(":"); } else { return super.hashCode(); } if (null != this.getName()) { sb.append(this.getName().hashCode()); sb.append(":"); } else { return super.hashCode(); } this.hashCode = sb.toString().hashCode(); } return this.hashCode; } } /*實體類*/ public class User implements Serializable { private static final long serialVersionUID = 1L;
private UserPK id; private int age;
public UserPK getId()
{
return id;
}
public UserPK setId()
{
this.id=id;
} public int getAge() { return age; } public void setAge() { this.age=age; } }
User.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > <hibernate-mapping package="com"> <class name="User" table="USER" > <meta attribute="sync-DAO">true</meta> <composite-id name="id" class="UserPK"> <key-property name="id" column="id" type="string"></key-property> <key-property name="name" column="name" type="string"></key-property> </composite-id> <property name="age" column="Age" type="int" /> </class> </hibernate-mapping>
以上僅僅只能當作參考,具體的還要根據實際情況修改以下送上我工作中的代碼

/* @(#)
*
*
*
* Modify Information:
* =============================================================================
* Author Date Description
* ------------ ---------- ---------------------------------------------------
* 徐志誠 2016-5-18 first release
*
*
* Copyright Notice:
* =============================================================================
* Copyright 2016 Huateng Software, Inc. All rights reserved.
*
* This software is the confidential and proprietary information of
* Shanghai HUATENG Software Co., Ltd. ("Confidential Information").
* You shall not disclose such Confidential Information and shall use it
* only in accordance with the terms of the license agreement you entered
* into with Huateng.
*
* Warning:
* =============================================================================
*
*/
package com.huateng.po;
import java.io.Serializable;
/**
* Title:
*
* Description:
*
* Copyright: Copyright (c) 2016-5-18
*
* Company: Shanghai Huateng Software Systems Co., Ltd.
*
*
*
* @version 1.0
*/
//@SuppressWarnings("serial")
public class Tblvatrule implements Serializable{
private static final long serialVersionUID = 1L;
public static String REF ="Tblvatrule";
public static String PROP_ORACLE_GL="oraclegl";
public static String PROP_GL_DESC="gldesc";
public static String PROP_DC_FLAG="dcflag";
public static String PROP_TAX_RATE="taxrate";
public static String PROP_TAN_NUM="tannum";
public static String PROP_EFF_DATE="effdate";
public static String PROP_status="status";
public static String PROP_MODIFY_TLR="modifytlr";
public static String PROP_MODIFY_TIME="modifytime";
public static String PROP_AUTH_TLR="authtlr";
public static String PROP_AUTH_TIME="authtime";
public static String PROP_TAX_GL="taxgl";
public static String PROP_TAX_CODE="taxcode";
public static String PROP_ID="id";
public Tblvatrule(){
}
public Tblvatrule(com.huateng.po.TblvatruleTmpPK id,java.lang.String oraclegl,java.lang.String dcflag){
this.setId(id);
this.setOraclegl(oraclegl);
this.setDcflag(dcflag);
initialize();
}
protected void initialize () {}
private com.huateng.po.TblvatruleTmpPK id;
/**
* @return the id
*/
public com.huateng.po.TblvatruleTmpPK getId() {
return id;
}
/**
* @param id the id to set
*/
public void setId(com.huateng.po.TblvatruleTmpPK id) {
this.id = id;
}
private java.lang.String oraclegl; //賬號
private java.lang.String gldesc; //賬戶描述
private java.lang.String dcflag; //借貸標識
private java.lang.String taxrate; //稅率
private java.lang.String txnnum; //交易碼
private java.lang.String effdate; //生效日期
private java.lang.String status; //狀態
private java.lang.String modifytlr; //錄入操作員
private java.lang.String modifytime; //錄入時間
private java.lang.String authtlr; //審核操作員
private java.lang.String authtime; //審核時間
private java.lang.String taxgl; //增值稅賬號
private java.lang.String taxcode; //增值稅代碼
private int hashCode = Integer.MIN_VALUE;
/**
* @return the taxgl
*/
public java.lang.String getTaxgl() {
return taxgl;
}
/**
* @param taxgl the taxgl to set
*/
public void setTaxgl(java.lang.String taxgl) {
this.taxgl = taxgl;
}
/**
* @return the taxcode
*/
public java.lang.String getTaxcode() {
return taxcode;
}
/**
* @param taxcode the taxcode to set
*/
public void setTaxcode(java.lang.String taxcode) {
this.taxcode = taxcode;
}
/**
* @return the oraclegl
*/
public java.lang.String getOraclegl() {
return oraclegl;
}
/**
* @param oraclegl the oraclegl to set
*/
public void setOraclegl(java.lang.String oraclegl) {
this.oraclegl = oraclegl;
}
/**
* @return the gldesc
*/
public java.lang.String getGldesc() {
return gldesc;
}
/**
* @param gldesc the gldesc to set
*/
public void setGldesc(java.lang.String gldesc) {
this.gldesc = gldesc;
}
/**
* @return the dcflag
*/
public java.lang.String getDcflag() {
return dcflag;
}
/**
* @param dcflag the dcflag to set
*/
public void setDcflag(java.lang.String dcflag) {
this.dcflag = dcflag;
}
/**
* @return the taxrate
*/
public java.lang.String getTaxrate() {
return taxrate;
}
/**
* @param taxrate the taxrate to set
*/
public void setTaxrate(java.lang.String taxrate) {
this.taxrate = taxrate;
}
/**
* @return the txnnum
*/
public java.lang.String getTxnnum() {
return txnnum;
}
/**
* @param txnnum the txnnum to set
*/
public void setTxnnum(java.lang.String txnnum) {
this.txnnum = txnnum;
}
/**
* @return the effdate
*/
public java.lang.String getEffdate() {
return effdate;
}
/**
* @param effdate the effdate to set
*/
public void setEffdate(java.lang.String effdate) {
this.effdate = effdate;
}
/**
* @return the status
*/
public java.lang.String getStatus() {
return status;
}
/**
* @param status the status to set
*/
public void setStatus(java.lang.String status) {
this.status = status;
}
/**
* @return the modifytlr
*/
public java.lang.String getModifytlr() {
return modifytlr;
}
/**
* @param modifytlr the modifytlr to set
*/
public void setModifytlr(java.lang.String modifytlr) {
this.modifytlr = modifytlr;
}
/**
* @return the modifytimel
*/
public java.lang.String getModifytime() {
return modifytime;
}
/**
* @param modifytimel the modifytimel to set
*/
public void setModifytime(java.lang.String modifytime) {
this.modifytime = modifytime;
}
/**
* @return the authtlr
*/
public java.lang.String getAuthtlr() {
return authtlr;
}
/**
* @param authtlr the authtlr to set
*/
public void setAuthtlr(java.lang.String authtlr) {
this.authtlr = authtlr;
}
/**
* @return the authtime
*/
public java.lang.String getAuthtime() {
return authtime;
}
/**
* @param authtime the authtime to set
*/
public void setAuthtime(java.lang.String authtime) {
this.authtime = authtime;
}
public boolean equals (Object obj) {
if (null == obj) return false;
if (!(obj instanceof com.huateng.po.Tblvatrule)) return false;
else {
com.huateng.po.Tblvatrule tvrt = (com.huateng.po.Tblvatrule) obj;
if (null == this.getId() || null == tvrt.getId()) return false;
else return (this.getId().equals(tvrt.getId()));
}
}
public int hashCode () {
if (Integer.MIN_VALUE == this.hashCode) {
if (null == this.getId()) return super.hashCode();
else {
java.lang.String hashStr = this.getClass().getName() + ":" + this.getId().hashCode();
this.hashCode = hashStr.hashCode();
}
}
return this.hashCode;
}
public java.lang.String toString () {
return super.toString();
}
}

/* @(#)
*
* Project:OCBCServer
*
* Modify Information:
* =============================================================================
* Author Date Description
* ------------ ---------- ---------------------------------------------------
* 徐志誠 2016-6-12 first release
*
*
* Copyright Notice:
* =============================================================================
* Copyright 2016 Huateng Software, Inc. All rights reserved.
*
* This software is the confidential and proprietary information of
* Shanghai HUATENG Software Co., Ltd. ("Confidential Information").
* You shall not disclose such Confidential Information and shall use it
* only in accordance with the terms of the license agreement you entered
* into with Huateng.
*
* Warning:
* =============================================================================
*
*/
package com.huateng.po;
import java.io.Serializable;
/**
* Title:
*
* Description:
*
* Copyright: Copyright (c) 2016-6-12
*
* Company: Shanghai Huateng Software Systems Co., Ltd.
*
* @author 徐志誠
*
* @version 1.0
*/
@SuppressWarnings("serial")
public class TblvatrulePK implements Serializable{
protected int hashCode = Integer.MIN_VALUE;
private java.lang.String oraclegl; //賬號
private java.lang.String dcflag; //借貸標識
public TblvatrulePK(){
}
public TblvatrulePK(java.lang.String oraclegl,java.lang.String dcflag){
this.setOraclegl(oraclegl);
this.setDcflag(dcflag);
}
/**
* @return the oraclegl
*/
public java.lang.String getOraclegl() {
return oraclegl;
}
/**
* @param oraclegl the oraclegl to set
*/
public void setOraclegl(java.lang.String oraclegl) {
this.oraclegl = oraclegl;
}
/**
* @return the dcflag
*/
public java.lang.String getDcflag() {
return dcflag;
}
/**
* @param dcflag the dcflag to set
*/
public void setDcflag(java.lang.String dcflag) {
this.dcflag = dcflag;
}
public boolean equals (Object obj) {
if (null == obj) return false;
if (!(obj instanceof com.huateng.po.TblvatrulePK)) return false;
else {
com.huateng.po.TblvatrulePK mObj = (com.huateng.po.TblvatrulePK) obj;
if (null != this.getOraclegl() && null != mObj.getOraclegl()) {
if (!this.getOraclegl().equals(mObj.getOraclegl())) {
return false;
}
}
else {
return false;
}
if (null != this.getDcflag() && null != mObj.getDcflag()) {
if (!this.getDcflag().equals(mObj.getDcflag())) {
return false;
}
}
else {
return false;
}
return true;
}
}
public int hashCode () {
if (Integer.MIN_VALUE == this.hashCode) {
StringBuilder sb = new StringBuilder();
if (null != this.getOraclegl()) {
sb.append(this.getOraclegl().hashCode());
sb.append(":");
}
else {
return super.hashCode();
}
if (null != this.getDcflag()) {
sb.append(this.getDcflag().hashCode());
sb.append(":");
}
else {
return super.hashCode();
}
this.hashCode = sb.toString().hashCode();
}
return this.hashCode;
}
}

<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > <hibernate-mapping package="com.huateng.po"> <class name="Tblvatrule" table="TBL_VAT_RULE" > <meta attribute="sync-DAO">true</meta> <composite-id name="id" class="TblvatruleTmpPK"> <key-property name="oraclegl" column="ORACLE_GL" type="string"></key-property> <key-property name="dcflag" column="DC_FLAG" type="string"></key-property> </composite-id> <property name="gldesc" column="GL_DESC" type="string" /> <property name="taxgl" column="TAX_GL" type="string" /> <property name="taxcode" column="TAX_CODE" type="string" /> <property name="taxrate" column="TAX_RATE" type="string" /> <property name="txnnum" column="TXN_NUM" type="string" /> <property name="effdate" column="EFF_DATE" type="string" /> <property name="status" column="STATUS" type="string" /> <property name="modifytlr" column="MODIFY_TLR" type="string" /> <property name="modifytime" column="MODIFY_TIME" type="string" /> <property name="authtlr" column="AUTH_TLR" type="string" /> <property name="authtime" column="AUTH_TIME" type="string" /> </class> </hibernate-mapping>
總結:復合主鍵是一個指一個主鍵是有一個以上字段組成,
當一個主鍵字段無法確保其唯一性時,需要其他字段一起形成唯一性,
優點是唯一性得到保證,缺點是影響查詢和修改的效率。