【HIbernate框架学习】:Hibernate复合主键映射
2016-12-17 21:57
337 查看
我们在学数据库原理与设计的时候,设计表的时候肯定遇到过复合主键的数据表,也就是两个字段或者两个以上
的字段作为数据表的主键。那么Hibernate框架的通常做法是将主键相关字段放到一个单独的类中,这样的类是有要
求的,首先四必须实现序列化接口,然后覆盖equals()和hashCode()方法。
在Hibernate中复合主键映射使用<composite-id>标签,元素包含的子元素是<key-property>元素,这里面放
的就是主键字段。
简单实例代码:
FiscalYearPeriod实体类:
FiscalYearPeriodPK实体类:
FiscalYearPeriod实体类对象关系映射文件:
测试类:
testSave1()方法
控制台输出:
数据库显示:
testLoad1()方法
控制台输出:
的字段作为数据表的主键。那么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()方法
控制台输出:
相关文章推荐
- 练习
- Android 应用加固?
- gdb简单学习
- Mongodb简单安装
- mysql与oracle常用函数及数据类型对比00持续补充
- CComObjectBase 和IUnknown 接口
- 理解伪元素 :before 和 :after
- 欢迎使用马克飞象
- C# Bitmap类型与Byte[]类型相互转化
- Struts2中Action接收参数的方法主要有以下三种:
- array_multisort 关联(string)键名保持不变,但数字键名会被重新索引。
- tshark抓包小结
- 轻松理解CRC差错检测算法(A PAINLESS GUIDE TO CRC ERROR DETECTION ALGORITHMS)七
- putchar()与getchar()
- pip安装python库时候出现http异常
- 自定义注解
- 【Spring】XML配置整合Mybatis
- 旅行家的预算 1999年NOIP全国联赛普及组NOIP全国联赛提高组
- JavaMail
- Unity实现自己的简易游戏窗口管理器