`

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(); 
    } 
}


分享到:
评论

相关推荐

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

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

    JPA注解实现联合主键

    本文档简单描述了注解实现联合主键类的生成

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

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

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

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

    JPA 联合主键

    JPA 联合主键实例 博文链接:https://zmx.iteye.com/blog/512468

    JPA_5_联合主键

    针对JPA资料进行整理,根据传智播客的教学视频,边看边写,文档包含了jpa的基本概念,相关注解解释,及一些增删改查的demo。本文档方便了对jpa的学习与复习,快速掌握基本操作。

    JPA联合主键

    NULL 博文链接:https://profound-accumulation.iteye.com/blog/2242299

    Spring Data JPA 建立表的联合主键

    主要介绍了Spring Data JPA 建立表的联合主键。本文详细的介绍了2种方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

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

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

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

    主要介绍了java hibernate使用注解来定义联合主键的相关资料,需要的朋友可以参考下

    jPA+hibernate

    JPA简单培置,JPA多对一,JPA一对一,JPA多对多,JPA联合主键几个小列子。

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

    NULL 博文链接:https://lc2586.iteye.com/blog/723644

    KanColle-JSON-Data:舰队Collection的JSON格式基础数据

    KanColle JSON Data 因为个人需要而整理的舰队Collection的 JSON 格式基础数据。 说明 基于 整理,非官方数据,也非游戏解包,...联合主键。 前者为没有实际含义的主键编号,后者为改修阶段。 没有改过的船的remodeling

    Hibernate实战(第2版 中文高清版)

     1.1.3 在Java中使用SQL   1.1.4 面向对象应用程序中的持久化   1.2 范式不匹配   1.2.1 粒度问题   1.2.2 子类型问题   1.2.3 同一性问题   1.2.4 与关联相关的问题   1.2.5 数据导航的问题   ...

    Hibernate注解

    * name 表示该表主键生成策略名称,它被引用在@GeneratedValue中设置的“gernerator”值中 * sequenceName 表示生成策略用到的数据库序列名称。 * initialValue 表示主键初始值,默认为0. * allocationSize 每次主键...

    Hibernate注释大全收藏

    @Id 注解可将实体Bean中某个属性定义为主键,使用@GenerateValue注解可以定义该标识符的生成策略。 • AUTO - 可以是 identity column, sequence 或者 table 类型,取决于不同底层的数据库 • TABLE - 使用table...

Global site tag (gtag.js) - Google Analytics