欢迎使用CSDN-markdown编辑器

来源:互联网 发布:c语言基本数据类型长度 编辑:程序博客网 时间:2024/06/05 11:04

Hibernate 复合主键的使用

先了解一下什么是复合主键:

需求:假设我们的一个表里面 一个字段是不能唯一的标记这一条记录的 假设我们现在需要在这个表里面使用两个或者多个字段来做为这个表的主键。

其实之前一直有个困惑:主键是唯一的索引,那么为何一个表可以创建多个主键呢?

其实“主键是唯一的索引”这话有点歧义的。举个例子,我们在表中创建了一个ID字段,自动增长,并设为主键,这个是没有问题的,因为“主键是唯一的索引”,ID自动增长保证了唯一性。
此时,我们再创建一个字段name,类型为varchar,也设置为主键,你会发现,在表的多行中你是可以填写相同的name值的,这岂不是有违“主键是唯一的索引”这句话么?
所以我才说“主键是唯一的索引”是有歧义的。应该是“当表中只有一个主键时,它是唯一的索引;当表中有多个主键时,称为复合主键,复合主键联合保证唯一索引”。

People表

pName pAddress pJaveScore pAndroidScore

pName和pAddress这两个字段才能唯一标识这一条记录 也就是说我们需要 使用这两个字段来作为主键(复合主键)

复合主键的使用

1>:首先将要作为主键的属性首先抽取成单独的实体 ,并提供get And set方法,还需要序列化

2>:在实际的实体中申明主键实体的变量

3>:在映射文件中编写实体的配置文件

映射文件 People.hbm.xml

<?xml version="1.0"?><!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.ljt.compositionKey">    <class name="People">        <!--配置的是表里面的主键-->        <composite-id name="key">          <key-property name="pName" type="java.lang.String" length="10"></key-property>          <key-property name="pAddress" type="java.lang.String" length="10"></key-property>        </composite-id>        <!--配置的是普通的列-->        <property name="pAndroidScore"></property>        <property name="pJavaScore"></property>    </class></hibernate-mapping>

CompositionKey.java

package com.ljt.compositionKey;import java.io.Serializable;/** * 复合主键的实体  * @author apple * */public class CompositionKey implements Serializable{    private static final long serialVersionUID = 1L;    private String pName;    private String pAddress;    public String getpName() {        return pName;    }    public void setpName(String pName) {        this.pName = pName;    }    public String getpAddress() {        return pAddress;    }    public void setpAddress(String pAddress) {        this.pAddress = pAddress;    }   }

People.java

package com.ljt.compositionKey;/** * 人这个对象 * @author apple * */public class People {    private CompositionKey key;    private float pJavaScore;    private float pAndroidScore;    public CompositionKey getKey() {        return key;    }    public void setKey(CompositionKey key) {        this.key = key;    }    public float getpJavaScore() {        return pJavaScore;    }    public void setpJavaScore(float pJavaScore) {        this.pJavaScore = pJavaScore;    }    public float getpAndroidScore() {        return pAndroidScore;    }    public void setpAndroidScore(float pAndroidScore) {        this.pAndroidScore = pAndroidScore;    }}

Test.java

package com.ljt.compositionKey;import org.hibernate.Session;import org.hibernate.cfg.Configuration;import org.junit.Test;/** * 测试复合主键的用法 * @author apple * */public class Test {    @Test    public void test() throws Exception {         Session session=new Configuration()        .configure("hibernate.cfg.xml")        .addClass(People.class)        .buildSessionFactory()        .openSession();        session.beginTransaction();        CompositionKey key=new CompositionKey();        key.setpName("小波波");        key.setpAddress("四川成都");        People people=new People();        people.setKey(key);        people.setpAndroidScore(13.45f);        people.setpJavaScore(65.34f);        //下面就储存        session.save(people);        session.getTransaction().commit();        session.close();    }}