联合主键可以通过Hibernate注解 进行映射,下面为大家展示三种实现方式:
一、方法一(本人喜欢使用这种方式,使用主键类字段时可以当做正常字段一样使用)
1.将联合主键的字段单独放在一个类中,该类需要重写equals和hashcode方法。
2.在主类中(该类包含联合主键类中的字段)将联合主键字段都注解为@Id。
3.最后在该类上加上注解:@IdClass(联合主键类.class),用来关联主键类
代码示例:
1 /** 2 * 3 */ 4 package kklazy.acqinstmanagement.model; 5 import javax.persistence.Column; 6 import kklazy.persistence.model.SupportModel; 7 8 /** 9 * @author10 * 主键类 11 */ 12 public class RouteProfitPK extends SupportModel{ 13 /** 14 * 15 */ 16 private static final long serialVersionUID = -4243768063352460725L; 17 /*复合主键值*/ 18 private String orgcode;//机构号 19 private String transType;//交易类型(前端) 20 21 /** 22 * 无参数的public构造方法,必须要有 23 */ 24 public RouteProfitPK() { 25 26 } 27 /** 28 * @return the orgcode 29 */ 30 @Column(name="ORGCODE") 31 public String getOrgcode() { 32 return orgcode; 33 } 34 /** 35 * @param orgcode the orgcode to set 36 */ 37 public void setOrgcode(String orgcode) { 38 this.orgcode = orgcode; 39 } 40 41 /** 42 * @return the transType 43 */ 44 @Column(name="TRANSTYPE") 45 public String getTransType() { 46 return transType; 47 } 48 /** 49 * @param transType the transType to set 50 */ 51 public void setTransType(String transType) { 52 this.transType = transType; 53 } 54 /* (non-Javadoc) 55 * @see java.lang.Object#hashCode() 56 */ 57 @Override 58 public int hashCode() { 59 final int prime = 31; 60 int result = 1; 61 result = prime * result + ((orgcode == null) ? 0 : orgcode.hashCode()); 62 result = prime * result + ((transType == null) ? 0 : transType.hashCode()); 63 return result; 64 } 65 /* (non-Javadoc) 66 * @see java.lang.Object#equals(java.lang.Object) 67 */ 68 @Override 69 public boolean equals(Object obj) { 70 if (this == obj) 71 return true; 72 if (obj == null) 73 return false; 74 if (getClass() != obj.getClass()) 75 return false; 76 RouteProfitPK other = (RouteProfitPK) obj; 77 if (orgcode == null) { 78 if (other.orgcode != null) 79 return false; 80 } else if (!orgcode.equals(other.orgcode)) 81 return false; 82 if (transType == null) { 83 if (other.transType != null) 84 return false; 85 } else if (!transType.equals(other.transType)) 86 return false; 87 return true; 88 } 89 90 91 92 }
1 package kklazy.acqinstmanagement.model; 2 import java.util.Date; 3 import javax.persistence.Column; 4 import javax.persistence.Entity; 5 import javax.persistence.Id; 6 import javax.persistence.IdClass; 7 import javax.persistence.Table; 8 import javax.persistence.Transient; 9 import kklazy.persistence.model.SupportModel; 10 11 /** 12 * @author 13 * 主表 14 */ 15 @Entity 16 @Table(name="ROUTE_PROFIT") 17 @IdClass(RouteProfitPK.class) 18 public class RouteProfit extends SupportModel{ 19 private String orgcode;//机构号 20 private String profitName;//分润名称 21 private String transType;//交易类型(前端) 22 private String payPeriod;//分润周期【00-日,01-周(1-7),02-月XX号(1-28)】格式为:00| (日)01|4 (每周4)02|12 (每月12日) 23 private String profitId;//分润方ID 24 private String status;//状态(00_正常01_禁用) 25 private Date entDate;//建立日期 26 private String operaName;//操作员 27 private String auditing;//审核(操作员 28 private String memo;//备注 29 30 private String transTypeName;//交易类型名称(页面显示) 31 /** 32 * @return the orgcode 33 */ 34 @Column(name="ORGCODE") 35 @Id 36 public String getOrgcode() { 37 return orgcode; 38 } 39 /** 40 * @param orgcode the orgcode to set 41 */ 42 public void setOrgcode(String orgcode) { 43 this.orgcode = orgcode; 44 } 45 /** 46 * @return the profitName 47 */ 48 @Column(name="PROFIT_NAME") 49 public String getProfitName() { 50 return profitName; 51 } 52 /** 53 * @param profitName the profitName to set 54 */ 55 public void setProfitName(String profitName) { 56 this.profitName = profitName; 57 } 58 /** 59 * @return the transType 60 */ 61 @Column(name="TRANSTYPE") 62 @Id 63 public String getTransType() { 64 return transType; 65 } 66 /** 67 * @param transType the transType to set 68 */ 69 public void setTransType(String transType) { 70 this.transType = transType; 71 } 72 /** 73 * @return the payPeriod 74 */ 75 @Column(name="PAYPERIOD") 76 public String getPayPeriod() { 77 return payPeriod; 78 } 79 /** 80 * @param payPeriod the payPeriod to set 81 */ 82 public void setPayPeriod(String payPeriod) { 83 this.payPeriod = payPeriod; 84 } 85 /** 86 * @return the profitId 87 */ 88 @Column(name="PROFIT_ID") 89 public String getProfitId() { 90 return profitId; 91 } 92 /** 93 * @param profitId the profitId to set 94 */ 95 public void setProfitId(String profitId) { 96 this.profitId = profitId; 97 } 98 /** 99 * @return the status 100 */ 101 @Column(name="STATUS") 102 public String getStatus() { 103 return status; 104 } 105 /** 106 * @param status the status to set 107 */ 108 public void setStatus(String status) { 109 this.status = status; 110 } 111 /** 112 * @return the entDate 113 */ 114 @Column(name="ENTDATE") 115 public Date getEntDate() { 116 return entDate; 117 } 118 /** 119 * @param entDate the entDate to set 120 */ 121 public void setEntDate(Date entDate) { 122 this.entDate = entDate; 123 } 124 /** 125 * @return the operaName 126 */ 127 @Column(name="OPERANAME") 128 public String getOperaName() { 129 return operaName; 130 } 131 /** 132 * @param operaName the operaName to set 133 */ 134 public void setOperaName(String operaName) { 135 this.operaName = operaName; 136 } 137 /** 138 * @return the auditing 139 */ 140 @Column(name="AUDITING") 141 public String getAuditing() { 142 return auditing; 143 } 144 /** 145 * @param auditing the auditing to set 146 */ 147 public void setAuditing(String auditing) { 148 this.auditing = auditing; 149 } 150 /** 151 * @return the memo 152 */ 153 @Column(name="MEMO") 154 public String getMemo() { 155 return memo; 156 } 157 /** 158 * @param memo the memo to set 159 */ 160 public void setMemo(String memo) { 161 this.memo = memo; 162 } 163 /** 164 * @return the transTypeName 165 */ 166 @Transient 167 public String getTransTypeName() { 168 return transTypeName; 169 } 170 /** 171 * @param transTypeName the transTypeName to set 172 */ 173 public void setTransTypeName(String transTypeName) { 174 this.transTypeName = transTypeName; 175 } 176 177 178 179 180 }
二、方法二
1.将联合主键的字段单独放在一个类中,该类需要重写equals和hascode方法。
2.在主类中(该类不包含联合主键类中的字段)保存该联合主键类的一个引用(新增主键类属性),并生成set和get方法。
3.最后为该类属性添加注解为@EmbeddedId
代码示例:
package kklazy.acqinstmanagement.model; import javax.persistence.Column; import kklazy.persistence.model.SupportModel; /** * @author * 主键类 */ public class RouteMerchFeePK extends SupportModel { /** * */ private static final long serialVersionUID = 1747760395347120749L; /*复合主键值*/ private String feeId; //手续费规则ID private String txnCode; //交易类型 private String fAmount; //机构限额金额 /** * 无参数的public构造方法,必须要有 */ public RouteMerchFeePK() { } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((fAmount == null) ? 0 : fAmount.hashCode()); result = prime * result + ((feeId == null) ? 0 : feeId.hashCode()); result = prime * result + ((txnCode == null) ? 0 : txnCode.hashCode()); return result; } /* (non-Javadoc) * @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; RouteMerchFeePK other = (RouteMerchFeePK) obj; if (fAmount == null) { if (other.fAmount != null) return false; } else if (!fAmount.equals(other.fAmount)) return false; if (feeId == null) { if (other.feeId != null) return false; } else if (!feeId.equals(other.feeId)) return false; if (txnCode == null) { if (other.txnCode != null) return false; } else if (!txnCode.equals(other.txnCode)) return false; return true; } /** * @return the feeId */ @Column(name="FEE_ID") public String getFeeId() { return feeId; } /** * @param feeId the feeId to set */ public void setFeeId(String feeId) { this.feeId = feeId; } /** * @return the txnCode */ @Column(name="TXN_CODE") public String getTxnCode() { return txnCode; } /** * @param txnCode the txnCode to set */ public void setTxnCode(String txnCode) { this.txnCode = txnCode; } /** * @return the fAmount */ @Column(name="F_AMOUNT") public String getfAmount() { return fAmount; } /** * @param fAmount the fAmount to set */ public void setfAmount(String fAmount) { this.fAmount = fAmount; } }
1 /** 2 * 3 */ 4 package kklazy.acqinstmanagement.model; 5 6 import java.math.BigDecimal; 7 import java.util.Date; 8 9 import javax.persistence.AttributeOverride; 10 import javax.persistence.AttributeOverrides; 11 import javax.persistence.Column; 12 import javax.persistence.EmbeddedId; 13 import javax.persistence.Entity; 14 import javax.persistence.Table; 15 import org.apache.commons.lang3.StringUtils; 16 import kklazy.persistence.model.SupportModel; 17 18 /** 19 * @author 20 * 主表 21 * 22 */ 23 @Entity 24 @Table(name="ROUTE_MERCH_FEE") 25 public class RouteMerchFee extends SupportModel { 26 27 public static final String FIXED_SEPARATOR = "|"; 28 public static final String FEE_TYPE_PERCENT = "01"; 29 /** 30 * 31 */ 32 private static final long serialVersionUID = -6959012843279862852L; 33 private RouteMerchFeePK id;//PK 34 private String feeType; //手续费类型 35 private String debltFee; //借记卡-手续费 36 private String creditFee; //贷记卡-手续费 37 private String status; //状态 38 private Date endDate; //建立日期 39 private String operaName; //操作员 40 private Date updDate; //修改日期 41 private String auditing; //审核 42 private String memo; //备注 43 44 45 46 47 /** 48 * @return the id 49 */ 50 @EmbeddedId 51 public RouteMerchFeePK getId() { 52 return id; 53 } 54 /** 55 * @param id the id to set 56 */ 57 public void setId(RouteMerchFeePK id) { 58 this.id = id; 59 } 60 61 /** 62 * @return the feeType 63 */ 64 @Column(name="FEETYPE") 65 public String getFeeType() { 66 return feeType; 67 } 68 /** 69 * @param feeType the feeType to set 70 */ 71 public void setFeeType(String feeType) { 72 this.feeType = feeType; 73 } 74 /** 75 * @return the debltFee 76 */ 77 @Column(name="DEBIT_FEE") 78 public String getDebltFee() { 79 return debltFee; 80 } 81 /** 82 * @param debltFee the debltFee to set 83 */ 84 public void setDebltFee(String debltFee) { 85 this.debltFee = debltFee; 86 } 87 88 public void setPageValueToDebltFee(){ 89 if(feeType.equals(FEE_TYPE_PERCENT)&& debitRate != null&& StringUtils.isNotEmpty(debitRate.trim()) ){ 90 // this.debltFee=String.valueOf(Double.valueOf(debitRate)/100.00) ; 91 this.debltFee = String.valueOf(BigDecimal.valueOf(Double.valueOf(debitRate).doubleValue()).divide(new BigDecimal("100"))); 92 }else{ 93 this.debltFee=debitRate; 94 } 95 this.debltFee=this.debltFee+"|"+this.debitRateMax+"|"+this.debitRateMin; 96 } 97 /** 98 * @return the creditFee 99 */ 100 @Column(name="CREDIT_FEE") 101 public String getCreditFee() { 102 return creditFee; 103 } 104 /** 105 * @param creditFee the creditFee to set 106 */ 107 public void setCreditFee(String creditFee) { 108 this.creditFee = creditFee; 109 } 110 111 public void setPageValueToCreditFee(){ 112 if(feeType.equals(FEE_TYPE_PERCENT) && crebitRate !=null && StringUtils.isNotEmpty(crebitRate.trim())){ 113 // this.creditFee=String.valueOf(Double.valueOf(crebitRate)/100.00); 114 this.creditFee= String.valueOf(BigDecimal.valueOf(Double.valueOf(crebitRate).doubleValue()).divide(new BigDecimal("100"))); 115 }else{ 116 this.creditFee=crebitRate; 117 } 118 this.creditFee=this.creditFee+"|"+this.crebitRateMax+"|"+this.crebitRateMin; 119 } 120 /** 121 * @return the status 122 */ 123 @Column(name="STATUS") 124 public String getStatus() { 125 return status; 126 } 127 /** 128 * @param status the status to set 129 */ 130 public void setStatus(String status) { 131 this.status = status; 132 } 133 /** 134 * @return the endDate 135 */ 136 @Column(name="ENTDATE") 137 public Date getEndDate() { 138 return endDate; 139 } 140 /** 141 * @param endDate the endDate to set 142 */ 143 public void setEndDate(Date endDate) { 144 this.endDate = endDate; 145 } 146 /** 147 * @return the operaName 148 */ 149 @Column(name="OPERANAME") 150 public String getOperaName() { 151 return operaName; 152 } 153 /** 154 * @param operaName the operaName to set 155 */ 156 public void setOperaName(String operaName) { 157 this.operaName = operaName; 158 } 159 /** 160 * @return the updDate 161 */ 162 @Column(name="UPDDATE") 163 public Date getUpdDate() { 164 return updDate; 165 } 166 /** 167 * @param updDate the updDate to set 168 */ 169 public void setUpdDate(Date updDate) { 170 this.updDate = updDate; 171 } 172 /** 173 * @return the auditing 174 */ 175 @Column(name="AUDITING") 176 public String getAuditing() { 177 return auditing; 178 } 179 /** 180 * @param auditing the auditing to set 181 */ 182 public void setAuditing(String auditing) { 183 this.auditing = auditing; 184 } 185 /** 186 * @return the memo 187 */ 188 @Column(name="MEMO") 189 public String getMemo() { 190 return memo; 191 } 192 /** 193 * @param memo the memo to set 194 */ 195 public void setMemo(String memo) { 196 this.memo = memo; 197 } 198 199 200 }
三、方法三
1.将联合主键的字段单独放在一个类中,该类需要重写equals和hascode方法。
2.该主键类注解为@Embeddable。
3.最后在主类中(该类不包含联合主键类中的字段)保存该联合主键类的一个引用(新增主键类属性),并生成set和get方法,并将该引用注解为@Id。
代码示例:
/** * 主键类 */ @Embeddable public class TestPK{ private static final long serialVersionUID = -3304319243957837925L; private long id ; private String name ; /** * @return the id */ public long getId() { return id; } /** * @param id the id to set */ public void setId(long id) { this.id = id; } /** * @return the name */ public String getName() { return name; } /** * @param name the name to set */ public void setName(String name) { this.name = name; } @Override public boolean equals(Object o) { if(o instanceof Testkey0101){ Testkey01 key = (TestKey01)o ; if(this.id == key.getId() && this.name.equals(key.getName())){ return true ; } } return false ; } @Override public int hashCode() { return this.name.hashCode(); } }
1 /* 2 * 主表类 3 */ 4 @Entity 5 @Table(name="Test") 6 public class Test { 7 8 private static final long serialVersionUID = 3524215936351012384L; 9 private String address ; 10 private int age ; 11 private String email ; 12 private String phone ; 13 @Id 14 private TestKey01 testKey ; 15 ...... 16 }