`

JPA中的联合主键

    博客分类:
  • jpa
 
阅读更多

两个或多个字段组成的主键,我们叫联合主键。在面向对象中,我们用JPA怎么定义这种情况呢?

怎么定义JPA 联合主键?用面向对象的思想来思考的话,联合主键里的复合主键(字段),可以把它看成一个整体,然后采用一个主键类来描述这个复合主键的字段

关于联合主键类,大家一定要遵守以下几点JPA规范:
1. 必须提供一个public的无参数构造函数。
2. 必须实现序列化接口
3. 必须重写hashCode()和equals()这两个方法。这两个方法应该采用复合主键的字段作为判断这个对象是否相等的


ArtLinePK.java

 
package cn.itcast.bean; 
 
import java.io.Serializable; 
 
import javax.persistence.Column; 
import javax.persistence.Embeddable; 
 
    @Embeddable 
    //这个注解代表ArtLinePK这个类是用在实体里面,告诉JPA的实现产品:在实体类里面只是使用这类定义的属性 
    //简单的理解为:ArtLinePK里的属性可以看成是ArtLine类里的属性,好比ArtLinePK的属性就是在ArtLine里定义的 
    public class ArtLinePK implements Serializable{ 
    private String startCity; 
    private String endCity; 
 
    public ArtLinePK() { 
    } 
 
    public ArtLinePK(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; 
        final ArtLinePK other = (ArtLinePK) 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; 
    } 
 
}


这个联合主键类,应该作为实体类的一个主键(实体标识符,id)

ArtLine.java

package cn.itcast.bean; 
 
import javax.persistence.Column; 
import javax.persistence.EmbeddedId; 
import javax.persistence.Entity; 
 
@Entity 
public class ArtLine { 
    private ArtLinePK id;//用面向对象的思想去思考的话,这个复合主键看成一个整体,由复合主键类ArtLinePK来描述 
    private String name; 
 
    public ArtLine() { 
    } 
 
    public ArtLine(ArtLinePK id) { 
        this.id = id; 
    } 
 
    public ArtLine(String startCity, String endCity, String name) { 
        this.id = new ArtLinePK(startCity, endCity); 
        this.name = name; 
    } 
 
    @EmbeddedId //按照JPA规范要求,我们并不是用@Id来标注它 
    //@EmbeddedId 这个注解用于标注id这个属性为实体的标识符,因为我们使用的是复合主键类, 
    //所以我们要用@EmbeddedId这个专门针对复合主键类的 用于标志实体标识符的注解 
    public ArtLinePK getId() { 
        return id; 
    } 
 
    public void setId(ArtLinePK id) { 
        this.id = id; 
    } 
 
    @Column(length=20) 
    public String getName() { 
        return name; 
    } 
 
    public void setName(String name) { 
        this.name = name; 
    } 
}


我们的复合主键类,目前为止,已经定义好了。定义好了之后,接着我们就看它生成的数据库表是否满足复合主键这么一种情况。

ArtLineTest.java

 
package junit.test; 
 
 
import javax.persistence.EntityManager; 
import javax.persistence.EntityManagerFactory; 
import javax.persistence.Persistence; 
 
import org.junit.BeforeClass; 
import org.junit.Test; 
 
import cn.itcast.bean.ArtLine; 
 
public class ArtLineTest { 
 
    @BeforeClass 
    public static void setUpBeforeClass() throws Exception { 
    } 
 
    @Test public void save(){ 
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast"); 
        EntityManager em = factory.createEntityManager(); 
        em.getTransaction().begin(); 
 
        em.persist(new ArtLine("PEK","SHA","北京飞上海")); 
 
        em.getTransaction().commit(); 
        em.close(); 
        factory.close(); 
    } 
}


分享到:
评论

相关推荐

    JPA注解实现联合主键

    在JPA中,我们可以通过`@IdClass`和`@Id`注解来实现联合主键。下面将详细介绍如何通过这些注解来实现联合主键。 ### 创建复合主键类 首先,需要创建一个复合主键类来存储需要组成联合主键的属性。这个类需要实现`...

    15_传智播客JPA详解_JPA中的联合主键

    本教程将聚焦于JPA中的一个关键概念——联合主键(Composite Key),这是处理多字段主键的一种方式。 联合主键是指在数据库表中,由两个或多个字段共同构成的唯一标识,这些字段的组合必须是唯一的。在JPA中,我们...

    JPA_5_联合主键

    本篇文章将深入探讨JPA中的联合主键概念、实现方式以及其在实际应用中的使用场景。 ### JPA 基本概念 JPA 是一种Java规范,它提供了一种标准的方式来管理和持久化Java对象到关系数据库。通过使用JPA,开发者可以...

    JPA 联合主键

    本文将深入探讨JPA中的联合主键概念、实现方式以及实际应用。 ### 1. 联合主键的概念 联合主键是指在数据库表中,通过两个或多个字段的组合来共同构成主键,以确保数据的唯一性。这种设计模式常用于那些单个字段...

    JPA联合主键

    **JPA联合主键详解** 在Java Persistence API (JPA) 中,主键是用于唯一标识实体的关键字段。在很多情况下,一个实体的主键可能不是由单一字段组成,而是由两个或更多个字段共同构成,这样的主键就被称为联合主键...

    JPA详解视频教程 第15讲 JPA中的联合主键.avi

    JPA用于整合现有的ORM技术,可以简化现有Java EE和Java SE应用对象持久化的开发工作,实现ORM的统一。JPA详解视频教程 第15讲 JPA中的联合主键.avi

    15_JPA详解_JPA中的联合主键.zip

    在JPA中,**联合主键(Composite Key)** 是指由两个或多个属性共同构成的主键,这与单个属性的简单主键相对。联合主键通常用于那些通过多个字段来唯一标识实体的情况。在关系数据库中,联合主键确保了表中每行数据...

    JPA学习总结(五)--JPACompositePK联合主键

    在JPA中,我们可以使用`@IdClass`或`@EmbeddedId`注解来实现联合主键。 1. **@IdClass**:这种方式需要创建一个单独的类来表示联合主键,这个类需要实现Serializable接口,并且每个主键字段都用@Id注解标识。然后在...

    Spring Data JPA 建立表的联合主键

    在 Spring Data JPA 中,建立表的联合主键是一种常见的需求,本文将详细介绍如何使用 Spring Data JPA 建立表的联合主键,并提供了两种实现方式。 首先,我们需要了解什么是联合主键。在关系数据库中,主键是用于...

    JPA主键策略(针对数据库自增字段重置后无效检查项)

    在JPA中,主键策略是指生成主键的机制,用于标识数据库表中的每一行记录。在本文中,我们将详细讨论JPA主键策略的类型、特点和应用场景。 GenerationType.IDENTITY GenerationType.IDENTITY 是一种常用的主键...

    使用@IdClass创建联合主键,并实现外部关联

    在 Java Persistence API(JPA)中,联合主键是指由多个字段组成的主键,可以使用@IdClass注解来实现。在本文中,我们将介绍如何使用@IdClass创建联合主键,并实现外部关联。 首先,我们需要创建三个实体类:...

    java hibernate使用注解来定义联合主键

    在Java Hibernate框架中,联合主键(Composite Key)是指由两个或多个属性共同构成的主键,这在处理一些特定的数据模型时非常有用。本文将详细介绍如何使用Hibernate注解来定义联合主键。 首先,我们需要了解联合...

    传智播客JPA学习笔记.pdf

    JPA中的联合主键** 联合主键使用@EmbeddedId和@Embeddable注解,将多个字段组合成一个复合主键,适用于那些不满足单一主键条件的表。 以上就是JPA学习笔记中的关键知识点,涵盖了JPA的基本概念、环境配置、对象...

    JPA讲解视频

    2. **实体ID(Entity ID)**:每个实体都有一个唯一的标识符,通常由`@Id`注解标记的字段表示,相当于数据库中的主键。 3. **持久化上下文(Persistence Context)**:JPA管理的对象状态,分为瞬时态、持久态和脱管...

    自己整理的JPA帮助文档

    联合主键(Composite Key)** - 当主键由两个或更多个字段组成时,可以使用`@IdClass`或`@EmbeddedId`来定义。 **7. 异步和缓存** - **异步处理**: 可以结合Java的ExecutorService或Spring的AsyncConfigurer进行...

    JPA标签(注解)详细说明

    - 在JPA中,实体类可以继承,通过`@Inheritance`注解可以定义继承策略,如单表继承(SINGLE_TABLE)、联合继承(JOINED)和子类表继承(TABLE_PER_CLASS)。 以上就是JPA中常用的一些注解及其功能,它们极大地简化...

    jpa学习总结,pdf类型的,详细介绍了jpa的应用

    - **定义与实现**:解释联合主键的概念,并展示其在JPA中的实现方式。 通过以上知识点的梳理,我们可以看出JPA不仅是一种强大的持久层框架,还具有高度的灵活性和扩展性,能够满足不同场景下的需求。同时,由于其...

Global site tag (gtag.js) - Google Analytics