【HIbernate框架学习】:Hibernate复合主键映射

       

        我们在学数据库原理与设计的时候,设计表的时候肯定遇到过复合主键的数据表,也就是两个字段或者两个以上

段作为数据表的主键。那么Hibernate框架的通常做法是将主键相关字段放到一个单独的类中,这样的类是有要

的,首先四必须实现序列化接口,然后覆盖equals()和hashCode()方法。

       在Hibernate中复合主键映射使用<composite-id>标签,元素包含的子元素是<key-property>元素,这里面放

就是主键字段。

       简单实例代码:

       FiscalYearPeriod实体类:

package com.demo.domain;

import java.util.Date;
  
/**
 * 核算期间
 * @author Administrator
 * @date 2016年12月14日
 */
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实体类:

package com.demo.domain;

import java.io.Serializable;

@SuppressWarnings("serial")
public class FiscalYearPeriodPK implements Serializable {
	
	//核算年
	private int fiscalYear;
	//核算月
	private int fiscalPeriod;

	public int getFiscalYear() {
		return fiscalYear;
	}

	public void setFiscalYear(int fiscalYear) {
		this.fiscalYear = fiscalYear;
	}

	public int getFiscalPeriod() {
		return fiscalPeriod;
	}

	public void setFiscalPeriod(int fiscalPeriod) {
		this.fiscalPeriod = fiscalPeriod;
	}

	@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;
		final FiscalYearPeriodPK other = (FiscalYearPeriodPK) obj;
		if (fiscalPeriod != other.fiscalPeriod)
			return false;
		if (fiscalYear != other.fiscalYear)
			return false;
		return true;
	}

}

       FiscalYearPeriod实体类对象关系映射文件:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="com.demo.domain.FiscalYearPeriod" table="t_fiscal_year_period">
		<!-- 复合主键 -->
		<composite-id name="fiscalYearPeriodPK">
			<key-property name="fiscalYear"/>
			<key-property name="fiscalPeriod"/>
		</composite-id>
		
		<property name="beginDate" type="date"/>
		<property name="endDate" type="date"/>
		<property name="periodSts"/>
	</class>
</hibernate-mapping>

       测试类:

package com.demo.test;

import java.util.Date;

import junit.framework.TestCase;

import org.hibernate.Session;

import com.demo.domain.FiscalYearPeriod;
import com.demo.domain.FiscalYearPeriodPK;
import com.demo.domain.HibernateUtils;

public class CompositePKMappingTest extends TestCase {

	public void testSave1() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			FiscalYearPeriod fiscalYearPeriod = new FiscalYearPeriod();
			
			//构造复合主键对象
			FiscalYearPeriodPK fiscalYearPeriodPK = new FiscalYearPeriodPK();
			fiscalYearPeriodPK.setFiscalYear(2016);
			fiscalYearPeriodPK.setFiscalPeriod(12);
			
			fiscalYearPeriod.setFiscalYearPeriodPK(fiscalYearPeriodPK);
			fiscalYearPeriod.setBeginDate(new Date());
			fiscalYearPeriod.setEndDate(new Date());
			fiscalYearPeriod.setPeriodSts("Y");
			
			session.save(fiscalYearPeriod);
			
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}	
	
	public void testLoad1() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();

			//构造复合主键对象
			FiscalYearPeriodPK fiscalYearPeriodPK = new FiscalYearPeriodPK();
			fiscalYearPeriodPK.setFiscalYear(2016);
			fiscalYearPeriodPK.setFiscalPeriod(12);
			
			FiscalYearPeriod fiscalYearPeriod = (FiscalYearPeriod)session.load(FiscalYearPeriod.class, fiscalYearPeriodPK);
			System.out.println(fiscalYearPeriod.getPeriodSts());
			
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}		
	
}

       testSave1()方法

       控制台输出:

       

       数据库显示:

       

       

       testLoad1()方法

       控制台输出:

       




           
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值