1.联合主键的映射规则

1) 类中的每个主键属性都对应到数据表中的每个主键列。

Hibernate要求具有联合主键的实体类实现Serializable接口,并且重写hashCode与equals方法,重写这两个方法的原因在于Hibernate要根据数据库的联合主键来判断某两行记录是否是一样的,如果一样那么就认为是同一个对象,如果不一样,那么就认为是不同的对象。这反映到程序领域中就是根据hashCode与equals方法来判断某两个对象是否能够放到诸如Set这样的集合当中。联合主键的实体类实现Serializable接口的原因在于使用get或load方法的时候需要先构建出来该实体的对象,并且将查询依据(联合主键)设置进去,然后作为get或load方法的第二个参数传进去即可。

2) 将主键所对应属性提取出一个类(称之为主键类),并且主键类需要实现Serializable接口,重写equals方法与hashCode方法,原因与上面一样。

以Student类为例,实现上述两种映射联合主键的配置:

2.Student中的两个属性作为联合主键属性

Student类:

  1. public class Student implements Serializable {//必须要实现Serializable接口
  2. private String cardID;//cardID和name映射为联合主键
  3. private String name;
  4. private int age;
  5. //get、set、hashCode、equals方法省略
  6. }

注:可使用MyEclipse中的Sourse-->Gennerate hashCode and equals来使用MyEclipse快速生成hashCode和equals方法

Student.hbm.xml配置:

  1. <class name="bean.Student" table="student">
  2. <composite-id><!--联合主键,student表中的主键为(student_name,card_id)-->
  3. <key-property name="name" column="student_name" type="string"></key-property><!--name及cardID为Student类中的属性-->
  4. <key-property name="cardID" column="card_id" type="string"></key-property>
  5. </composite-id>
  6. <property name="age" column="student_age" type="int"></property>
  7. </class>

保存对象:

  1. tx=session.beginTransaction();
  2. Student s1=new Student();
  3. s1.setName("lisi");
  4. s1.setAge(22);
  5. s1.setCardID("711");
  6. System.out.println(s1);
  7. session.save(s1);
  8. tx.commit();

注意:主键为(card_id,student_id)若连续执行上述的保存语句两次,当然会抛异常,应为主键重复:   
           org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
3.将Student类中的两个主键属性提取为一个新的类PrimaryKey,即主键类

主键类PrimaryKey:

  1. public class PrimaryKey implements Serializable{
  2. private String cardID;
  3. private String name;
  4. //get、set、hashCode、equals方法省略
  5. }

Student类中含有PrimaryKey类型的属性及对应set、get方法:

  1. public class Student  {
  2. private int age;
  3. private PrimaryKey primaryKey;
  4. //set、get方法省略
  5. }

Student.hbm.xml文件中的配置:

  1. <class name="bean.Student" table="student">
  2. <composite-id name="primaryKey" class="bean.PrimaryKey"><!--PrimaryKey为我们自定义的主键类-->
  3. <key-property name="name" column="student_name" type="string"></key-property><!--name及cardID为PrimaryKey类中的属性-->
  4. <key-property name="cardID" column="card_id" type="string"></key-property>
  5. </composite-id>
  6. <property name="age" column="student_age" type="int"></property>
  7. </class>

保存对象:

  1. tx=session.beginTransaction();
  2. Student s1=new Student();
  3. s1.setAge(23);
  4. PrimaryKey p=new PrimaryKey();
  5. p.setCardID("102");
  6. p.setName("zhangsan");
  7. s1.setPrimaryKey(p);
  8. session.save(s1);
  9. tx.commit();

同样,对于上述代码的重复执行也会导致主键重复抛出异常。

查询:

  1. PrimaryKey p=new PrimaryKey();
  2. p.setCardID("711");
  3. p.setName("lisi");
  4. Student s=(Student)session.get(Student.class,p);//所以PrimaryKey要实现Serializable接口
  5. System.out.println(s.getAge());

4.对于以上两种映射联合主键的方式,反映到数据库中的表的结构是相同的,student表的内容为:

转载请注明出处:http://blog.csdn.net/jialinqiang/article/details/8704538

Hibernate联合主键映射的更多相关文章

  1. Hibernate 中 联合主键映射 组合关系映射 大对象映射(或者说文本大对象,二进制数据大对象)

    Clob:文本大对象,最长4G Blob:二进制数据大对象,最长4G util: public class HibUtil { private static SessionFactory sessio ...

  2. hibernate 联合主键生成机制(组合主键XML配置方式)

    hibernate 联合主键生成机制(组合主键XML配置方式)   如果数据库中用多个字段而不仅仅是一个字段作为主键,也就是联合主键,这个时候就可以使用hibernate提供的联合主键生成策略. 具体 ...

  3. hibernate 联合主键 composite-id

    如果表使用联合主键(一个表有两个以上的主键),你可以映射类的多个属性为标识符属性.如:<composite-id>元素接受<key-property> 属性映射(单表映射)和& ...

  4. 这是一个hibernate 联合主键的例子

    package com.bird.entity; import java.io.Serializable; import javax.persistence.Entity; import javax. ...

  5. Hibernate一对一主键映射

    Hibernate一对一主键映射                        ------------------------------                            -- ...

  6. Java进阶知识05 Hibernate联合主键之Annotation(注解)和XML实现方式

    1.Hibernate联合主键(Annotation实现) 1.1.单列主键 1.1.1.为什么要有主键? //唯一确定一条记录    1.1.2.一个表能否有多个主键? //不能    1.1.3. ...

  7. hibernate 注解 联合主键映射

    联合主键用Hibernate注解映射方式主要有三种: 第一.将联合主键的字段单独放在一个类中,该类需要实现java.io.Serializable接口并重写equals和hascode,再将 该类注解 ...

  8. hibernate 联合主键

      xml方式处理联合主键:   以有两个主键:id和name的student表为例. 先创建个主键类:   package com.bjsxt.hibernate; //黑色为必写项 public ...

  9. Hibernate 组合主键映射

    在开发过程中创建数据库表时,有时候会发现单纯的创建一个主键是不可行的,有时候就需要多个字段联合保持唯一,本文讲述如何创建组合主键的映射. 例如:记录一个班的考试成绩.学生跟科目是多对多的关系,只有一个 ...

随机推荐

  1. JS 获取浏览器和屏幕宽高等信息代码

    JS 获取浏览器和屏幕宽高等信息. 网页可见区域宽:document.body.clientWidth  网页可见区域高:document.body.clientHeight  网页可见区域宽:doc ...

  2. 2013/8/28 JS+HTML 三级省市区联动

    var mp = ["安徽","北京","福建","甘肃","广东","广西", ...

  3. MongoDB中通过MapReduce实现合计Sum功能及返回格式不一致问题分析

    建立下述测试数据,通过MapReduce统计每个班级学生数及成绩和. 代码如下: public string SumStudentScore() { var collection = _dataBas ...

  4. 6)Java中String类

    1)String对象的初始化   由于String对象特别常用,所以在对String对象进行初始化时,Java提供了一种简化的特殊语法,格式如下:     String s = “abc”;     ...

  5. U盘启动

    2014.4.3修改 其实用U盘制作系统也可以下载一个软碟通UltraISO,就可以很方便的制作. ----以前的版本 用U盘装系统,很方便快捷,下面这个网站介绍的比较详细,于是自己整理了一下,作为收 ...

  6. 浅议iOS网络数据解析

    /*------------------------------------ 数据解析: 1.JSON数据 --------------------------------*/ 重点:1.什么是JSO ...

  7. NOJ1142-最大连续和

    最大连续和 时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte总提交 : 1282            测试通过 : 230 ...

  8. HDU1006

    Problem Description The three hands of the clock are rotating every second and meeting each other ma ...

  9. Oracle Imp and Exp (导入和导出) 数据 工具使用

    Oracle 提供两个工具imp.exe 和exp.exe分别用于导入和导出数据.这两个工具位于Oracle_home/bin目录下. 导入数据exp 1 将数据库ATSTestDB完全导出,用户名s ...

  10. Power Map 入门

    Excel 的 Microsoft Power Map是三维 (3-D) 数据的可视化工具,允许您以新的方式看信息.电源映射允许您发现您可能看不到传统的二维 (2-d) 表和图中的见解. 使用Powe ...