Hibernate复合主键映射

本文介绍Hibernate中如何使用复合主键,并提供了一个基于核算期间的实际案例。通过将多个自然属性组合为一个复合主键,可以满足某些特定业务场景的需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    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;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + fiscalPeriod;
		result = prime * result + fiscalYear;
		return result;
	}

	@Override
	public 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>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值