hibernate 联合主键
2012-08-12 15:53
253 查看
我们知道某些表的主键并不是某个字段唯一确定的,而是由多个字段确定,这叫做联合主键,那么hibernate怎样帮我们实现联合主键呢?
要想实现联合主键,实体类必须有两个约束条件:
1:实体类必须实现Serializable接口。
2:实体类必须实现equals方法和hashCode方法。实现这两个方法的原因是帮助hibernate判断这个实体对象是否已经在表中存在。
类的配置文件中用
<composite-id>标签来声明联合主键。
主键列用<key-property>来声明,有几个主属性声明几次。
下面是完整的代码示例。
StudentGrade,学生成绩类,有sno(学号),cno(课程号),grade(成绩),主键是 sno和cno作为联合主键。
StudentGrade.hbm.xml
create表的ddl语句
primary(sno,cno)确实符合的要求。
要想实现联合主键,实体类必须有两个约束条件:
1:实体类必须实现Serializable接口。
2:实体类必须实现equals方法和hashCode方法。实现这两个方法的原因是帮助hibernate判断这个实体对象是否已经在表中存在。
类的配置文件中用
<composite-id> <key-property name="sno" column="sno" type="java.lang.Long"></key-property> <key-property name="cno" column="cno" type="java.lang.Long"></key-property> </composite-id>
<composite-id>标签来声明联合主键。
主键列用<key-property>来声明,有几个主属性声明几次。
下面是完整的代码示例。
StudentGrade,学生成绩类,有sno(学号),cno(课程号),grade(成绩),主键是 sno和cno作为联合主键。
package com.shizhan.po; import java.io.Serializable; public class StudentGrade implements Serializable{ private Long sno ; private Long cno ; private int grade ; public Long getSno() { return sno; } public void setSno(Long sno) { this.sno = sno; } public Long getCno() { return cno; } public void setCno(Long cno) { this.cno = cno; } public int getGrade() { return grade; } public void setGrade(int grade) { this.grade = grade; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((cno == null) ? 0 : cno.hashCode()); result = prime * result + ((sno == null) ? 0 : sno.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; StudentGrade other = (StudentGrade) obj; if (cno == null) { if (other.cno != null) return false; } else if (!cno.equals(other.cno)) return false; if (sno == null) { if (other.sno != null) return false; } else if (!sno.equals(other.sno)) return false; return true; } }
StudentGrade.hbm.xml
<?xml version="1.0" encoding="utf-8"?> <!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.shizhan.po.StudentGrade" table="STUDENTGrade" schema="SCOTT"> <composite-id> <key-property name="sno" column="sno" type="java.lang.Long"></key-property> <key-property name="cno" column="cno" type="java.lang.Long"></key-property> </composite-id> <property name="grade" type="int"></property> </class> </hibernate-mapping>
create表的ddl语句
create table SCOTT.STUDENTGrade ( sno number(19,0) not null, cno number(19,0) not null, grade number(10,0), primary key (sno, cno) )
primary(sno,cno)确实符合的要求。
相关文章推荐
- 【hibernate框架】如何配置联合主键-XML与Annotation样例剖析
- Hibernate联合主键在实体类中的配置
- hibernate中的Annotation补充 联合主键
- Hibernate基于XML的----联合主键配置
- 关于hibernate联合(单个)主键查询语句返回值为空的问题
- hibernate ID联合生成主键
- 【Hibernate框架开发之四】Hibernate-Annotation常用的注解归总&&ID的生成策略&&联合主键
- hibernate ID联合生成主键
- Hibernate的联合主键
- hibernate联合主键 注解方式
- hibernate联合主键的三种注解做法
- Hibernate ID生成策略/联合主键解决方案
- hibernate联合主键(composite-id)
- Hibernate注解映射联合主键的三种主要方式
- Hibernate学习篇04——联合主键(一)
- hibernate中联合主键的使用
- 慎用hibernate联合主键
- Hibernate联合主键映射规则和数据查询原理
- Hibernate映射联合主键
- Hibernate中用到联合主键的使用方法,为何要序列化,为何要重写hashcode 和 equals 方法