Hibernate复合主键映射

来源:互联网 发布:软件 win7 开机启动 编辑:程序博客网 时间:2024/05/16 17:08

    Hibernate中除了使用<generator>来生成主键之外,还可以根据具体的需求让持久化类的标识符属性映射成数据库的符合主键。

        通常做法是将主键相关字段放到一个单独的类中,这样的类是由要求的:必须实现序列化接口;覆盖equals和hashcode方法。

下面是具体的代码实现:

 ExportDB.java文件:

package com.lsh.hibernate;import org.hibernate.cfg.Configuration;import org.hibernate.tool.hbm2ddl.SchemaExport;/** * 将hbm生成ddl * @author lsh * */public class ExportDB {public static void main(String[] args) {//默认读写hibernate.cfg.xml文件Configuration cfg = new Configuration().configure();        SchemaExport export = new SchemaExport(cfg);export.create(true, true);}}
FiscalYearPeriod.java文件:

package com.lsh.hibernate;import java.util.Date;  /** * 核算期间 * @author wangy * */public class FiscalYearPeriod {private FiscalYearPeriodPK fiscalYearPeriodPK;//开始日期private Date beginDate;//结束日期private Date endDate;//状态private String periodSts;public Date getBeginDate() {return beginDate;}public void setBeginDate(Date beginDate) {this.beginDate = beginDate;}public Date getEndDate() {return endDate;}public void setEndDate(Date endDate) {this.endDate = endDate;}public String getPeriodSts() {return periodSts;}public void setPeriodSts(String periodSts) {this.periodSts = periodSts;}public FiscalYearPeriodPK getFiscalYearPeriodPK() {return fiscalYearPeriodPK;}public void setFiscalYearPeriodPK(FiscalYearPeriodPK fiscalYearPeriodPK) {this.fiscalYearPeriodPK = fiscalYearPeriodPK;}}
FiscalYearPeriodPK.java文件:

package com.lsh.hibernate;import java.io.Serializable;public class FiscalYearPeriodPK implements Serializable {//核算年private int fiscalYear;//核算月private int fiscalPeriod;public int getFiscalYear() {return fiscalYear;}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + fiscalPeriod;result = prime * result + fiscalYear;return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;FiscalYearPeriodPK other = (FiscalYearPeriodPK) obj;if (fiscalPeriod != other.fiscalPeriod)return false;if (fiscalYear != other.fiscalYear)return false;return true;}public void setFiscalYear(int fiscalYear) {this.fiscalYear = fiscalYear;}public int getFiscalPeriod() {return fiscalPeriod;}public void setFiscalPeriod(int fiscalPeriod) {this.fiscalPeriod = fiscalPeriod;}}
FiscalYearPeriod.hbm.xml文件:

<hibernate-mapping package="com.lsh.hibernate"><class name="FiscalYearPeriod" table="t_fiscalyearperiod">  <composite-id name="fiscalYearPeriodPK"> <key-property name="fiscalPeriod"/> <key-property name="fiscalYear"/>       </composite-id>      <property name="beginDate"/>  <property name="endDate"/>  <property name="periodSts"/></class></hibernate-mapping>

        在实际项目中能尽可能减少复合主键也是有必要的,因为复合主键使用的是自然属性作为码,一旦自然属性需要修改,那么修改主键是非常麻烦的一件事情,所以使用代理主键作为数据库的主键策略是最好的。
0 0
原创粉丝点击