符合主键映射或联合主键映射:表中的两个字段共同构成主键的映射
FiscalYearPeriod类:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.cnblogs.hibernate_first; import java.util.Date; public class FiscalYearPeriod { private FiscalYearPeriodPK fiscalYearPeriodPK; public FiscalYearPeriodPK getFiscalYearPeriodPK() { return fiscalYearPeriodPK; } public void setFiscalYearPeriodPK(FiscalYearPeriodPK fiscalYearPeriodPK) { this.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; } }
FiscalYearPeriodPK类(复合主键类,必须序列化):
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.cnblogs.hibernate_first; import java.io.Serializable; 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; FiscalYearPeriodPK other = (FiscalYearPeriodPK) obj; if (fiscalPeriod != other.fiscalPeriod) return false; if (fiscalYear != other.fiscalYear) return false; return true; } }
FiscalYearPeriod.hbm.xml:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" > <hibernate-mapping package="com.cnblogs.hibernate_first"> <class name="FiscalYearPeriod" table="t_fiscalYearPeriod"> <!-- id只能描述单一主键,如果复活主键需要使用composite <id name="id" column="t_id"> <generator class="native"></generator> </id> --> <composite-id name="fiscalYearPeriodPK"> <key-property name="fiscalYear"></key-property> <key-property name="fiscalPeriod"></key-property> </composite-id> <property name="beginDate" column="t_beginDate" /> <property name="endDate" column="t_endDate" /> <property name="periodSts" column="t_periodSts" /> </class> </hibernate-mapping>
Test类:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.cnblogs.hibernate_first; import java.text.SimpleDateFormat; import java.util.Date; import org.hibernate.Session; import junit.framework.TestCase; public class compositePk_mappingTest extends TestCase { public void testSave1() { Session session = null; try { session = HibernateUtils.getSession(); session.beginTransaction(); FiscalYearPeriod fiscalYearPeriod = new FiscalYearPeriod(); FiscalYearPeriodPK fiscalYearPeriodPK = new FiscalYearPeriodPK(); fiscalYearPeriodPK.setFiscalYear(2018); fiscalYearPeriodPK.setFiscalPeriod(10); fiscalYearPeriod.setFiscalYearPeriodPK(fiscalYearPeriodPK); //fiscalYearPeriod.setBeginDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); fiscalYearPeriod.setBeginDate(new Date()); fiscalYearPeriod.setEndDate(new Date()); fiscalYearPeriod.setPeriodSts(new String("傻逼")); 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(2018); fiscalYearPeriodPK.setFiscalPeriod(10); FiscalYearPeriod fiscalYearPeriod = session.load(FiscalYearPeriod.class,fiscalYearPeriodPK); System.out.println(fiscalYearPeriod.getPeriodSts() +" "+ fiscalYearPeriod.getBeginDate()+" "+fiscalYearPeriod.getEndDate() + " "+fiscalYearPeriod.getFiscalYearPeriodPK().getFiscalYear() +" "+ fiscalYearPeriod.getFiscalYearPeriodPK().getFiscalPeriod()); session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); session.getTransaction().rollback(); } finally { HibernateUtils.closeSession(session); } } }