JPA学习---第十二节:JPA中的联合主键

1、定义实体类,代码如下:

(1)、将联合主键放到一个类中,代码如下:

package learn.jpa.entity;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Embeddable;

/**
 *
 * 1、必须要有无擦得构造函数
 * 2、必须要实现序列接口
 * 3、必须重写 equals() 和 hashCode() 方法
 * @Embeddable 告诉 jpa 只是使用实体类里面的属性
 */
@Embeddable
public class AirLinePK implements Serializable{

    /**
     *
     */
    private static final long serialVersionUID = 1L;
    private String startCity;
    private String endCity;

    public AirLinePK() {

    }

    public AirLinePK(String startCity, String endCity) {
        this.startCity = startCity;
        this.endCity = endCity;
    }

    @Column(length=3)
    public String getStartCity() {
        return startCity;
    }
    public void setStartCity(String startCity) {
        this.startCity = startCity;
    }
    @Column(length=3)
    public String getEndCity() {
        return endCity;
    }
    public void setEndCity(String endCity) {
        this.endCity = endCity;
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((endCity == null) ? 0 : endCity.hashCode());
        result = prime * result
                + ((startCity == null) ? 0 : startCity.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;
        AirLinePK other = (AirLinePK) obj;
        if (endCity == null) {
            if (other.endCity != null)
                return false;
        } else if (!endCity.equals(other.endCity))
            return false;
        if (startCity == null) {
            if (other.startCity != null)
                return false;
        } else if (!startCity.equals(other.startCity))
            return false;
        return true;
    }

}

(2)、定义 AirLine 实体类,代码如下:

package learn.jpa.entity;

import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;

@Entity
public class AirLine {

    private AirLinePK id;
    private String name;

    public AirLine(){}

    public AirLine(AirLinePK id) {
        this.id = id;
    }

    public AirLine(String startCity, String endCity, String name){
        this.id = new AirLinePK(startCity, endCity);
        this.name = name;
    }

    // @EmbeddedId 用于标注为实体的标识符
    @EmbeddedId
    public AirLinePK getId() {
        return id;
    }
    public void setId(AirLinePK id) {
        this.id = id;
    }
    @Column(length=30)
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

2、测试类,代码:

package learn.jpa.test;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import learn.jpa.entity.AirLine;

import org.junit.Test;

public class AirLineTest {

    /**
     * 测试数据库是否可以生成表
     */
    @Test
    public void test() {
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("learn_jpa");
        factory.close();
    }

    @Test
    public void save(){
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("learn_jpa");
        EntityManager em = factory.createEntityManager();
        em.getTransaction().begin();   // 开启事务
        em.persist(new AirLine("PEK","SHA","北京飞上海"));
        em.getTransaction().commit();
        em.close();
        factory.close();
    }
}

注意:

1、必须实现Serializable序列化

2、必须提示无参的构造方法

3、必须重写hashCode和equals方法

@Embeddable 表示该类中所有属性在应用该联合主键的类中作为它的属性(字段)

时间: 2024-11-04 14:45:01

JPA学习---第十二节:JPA中的联合主键的相关文章

SQL Server中的联合主键、聚集索引、非聚集索引

我们都知道在一个表中当需要2列以上才能确定记录的唯一性的时候,就需要用到联合主键,当建立联合主键以后,在查询数据的时候性能就会有很大的提升,不过并不是对联合主键的任何列单独查询的时候性能都会提升,但我们依然可以通过对联合主键中的首列除外的其他列建立非聚集索引来提高性能.本文将对联合主键.聚集索引.非聚集索引对查询性能的影响举例说明.步骤一,建立一个测试表,并且插入350万条以上的数据. /*创建测试数据表*/create table MyTestTable(id varchar(10)not n

Hibernate 查询排序与联合主键映射

1.查询排序 (1)数据库排序(推荐) <map order-by="name ase" > <!--name的升序,降序desc--> session.createQuery(" ").uniqueResult() //返回唯一的对象,前台对象只有一个 <set order-by="name asc"> (2)内存排序 <set sort="natural" > sort属性值

hybris impex导入 联合主键对象

hybris impex 中的联合主键 对象插入语句 INSERT_UPDATE SomeStatus;code[unique=true];key[unique=true] ;01;approvedStatus ;02;approvedStatus ;01;sendStatus ;02;sendStatus

JPA注解实现联合主键

当表中一个主键不能唯一标识一条记录的时候,就需要使用联合主键了,下面是使用JPA注解实现联合主键的代码 1 首先需要建立一个复合主键类,用来存放需要生产联合主键的属性,该类需要实现序列化. package com.ericsson.adp.entity.cons; import java.io.Serializable; public class ConsumerGroupMapPK implements Serializable{ private String msisdn;//电话号码 pr

JPA联合主键的使用

对于绝大多数情况一个表只会有一个字段是主键,但是比较特殊的情况下可能会有多个字段一起构成主键,这样的主键就是联合主键了.下面用一个小例子来说明这个情况,我们知道飞行用的航线一般有起点和终点构成,也就是说可以根据起点和终点确定航线,这种情况联合主键就能发挥它的作用了.针对这种情况我们需要把起点和终点封装成一个对象之后作为联合主键使用. 1  联合主键的java类 package org.lxh.info; import java.io.Serializable; import javax.pers

JPA联合主键@EmbeddedId使用详解附查询例子

花了2个小时的时间解决这个问题,网上资料太少,记录下 详情看源文件TBicPrmCompute,TBicPrmComputePK package com.isoftstone.core.domain; import java.io.Serializable; import javax.persistence.*; /** * The persistent class for the T_BIC_PRM_COMPUTE database table. * */ @Entity @NamedQuer

《Hibernate学习笔记之三》:联合主键的映射

<Hibernate学习笔记之三>:联合主键的映射 就如在前面所举的例子一样,是使用的id作为唯一的主键,一般情况下我们也只使用唯一的一个属性作为主键,但是在实际中,我们可能会遇到几个属性作为主键的情况,因此,在本篇博文中,就来介绍下,联合主键的映射关系应该如何来做?? 联合主键的映射有两种方式来进行实现. 1.使用映射文件 XXX.bhm.xml 2.使用Annotation Hibernate首先需要使用联合主键的实体类必须实现Serializable接口,即为了使序列能够被序列化进行传输

Hibernate学习笔记_联合主键

复合主键(联合主键):多个字段构成唯一性. 一,xml方式 1. 将联合主键的属性提取出来,重新编写一个StudentPK类(原Student类中的id,name要删除 并新加入属性“StudentPK”) //StudentPK .javapackage com.bjsxt.hibernate; public class StudentPK implements java.io.Serializable{ private int id; private String name; public

Hibernate中联合主键生成策略

一.xml配置联合主键 单独设计一个类,作为主键类,如StudentPK A.实现序列化(Serializable接口) B.重写equals()和hashCode() 为什么要从写equals()和hashCode()方法? hashCode相同的会被存储在hash表的同一位置,当找到特定的hashcode之后,会根据equals()方法判断是否是相同的对象,来查找到对应的数据. 小实验1: (1)创建联合主键类StudentPK package com.zgy.hibernate.model