您的位置:首页 > 其它

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

2016-12-17 21:57 337 查看
我们在学数据库原理与设计的时候,设计表的时候肯定遇到过复合主键的数据表,也就是两个字段或者两个以上

的字段作为数据表的主键。那么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()方法

控制台输出:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: