【Hibernate】复合主键映射
2017-01-14 17:38
357 查看
上篇博客介绍了 继承映射,这篇博客介绍一下复合主键映射,我们在日常开发中经常遇到这样一种情况,数据库中的某张表需要多个字段列才能唯一确定一行记录,这时需要使用复合主键。
复合主键映射需要在映射配置文件中使用<composite-id>标签,该标签是指将一个类指定为相应的复合主键,它的name属性需要指定类文件中定义的属性值,并在该标签中添加<key-property>子标签。并且需要将复合主键放到一个类中,将这个类和其它属性放到一个类中,复合主键的类必须要实现接口Serializable.
复合主键映射的例子:
年限和持续时间两个共同作为主键
一、类文件
因为年限和持续时间两个共同作为主键,所以年限和持续时间被封装成一个类FiscalYearPeriodPK,FiscalYearPeriod类封装其它属性以及FiscalYearPeriodPK类。
FiscalYearPeriodPK.java:
FiscalYearPeriod.hbm.xml:
小结:
现在我们很少使用到这种复合主键了,因为考虑到数据库的优化,常常会把复合主键拆分到两个表中,并利用一个关系表来维护两个表的关系,关系表中不添加主键。
复合主键映射需要在映射配置文件中使用<composite-id>标签,该标签是指将一个类指定为相应的复合主键,它的name属性需要指定类文件中定义的属性值,并在该标签中添加<key-property>子标签。并且需要将复合主键放到一个类中,将这个类和其它属性放到一个类中,复合主键的类必须要实现接口Serializable.
复合主键映射的例子:
年限和持续时间两个共同作为主键
一、类文件
因为年限和持续时间两个共同作为主键,所以年限和持续时间被封装成一个类FiscalYearPeriodPK,FiscalYearPeriod类封装其它属性以及FiscalYearPeriodPK类。
FiscalYearPeriodPK.java:
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.java:
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; } }二、配置文件
FiscalYearPeriod.hbm.xml:
<hibernate-mapping> <class name="com.hibernate.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>
小结:
现在我们很少使用到这种复合主键了,因为考虑到数据库的优化,常常会把复合主键拆分到两个表中,并利用一个关系表来维护两个表的关系,关系表中不添加主键。
相关文章推荐
- JavaScript的事件机制
- button防止被重复点击的相关方法(详细版)
- iOS-蚂蚁金服面试题(一)
- C程序中变量存放方式介绍
- OpenGL 纹理本质
- quagga源码分析--路由信息处理zebra-rib
- 可编辑单元格版本二
- 【Backbone】 Backbone初探
- iOS 开发之 点击tabbarItem添加是否跳转登录页面判断
- 代码结构
- 测试我的第一个博客
- HTTP之Cookie
- Caused by: java.lang.ClassNotFoundException: net.sf.json.JSONObject
- Java基本数据类型
- 底部提示框
- adb 命令查看 包名 对应包名 apk
- mongodb学习笔记
- 一个简单的HTML表单及JavaScript验证
- codeforces 735 A Ostap and Grasshopper
- SQL Injection绕过技巧