`
mzhj
  • 浏览: 223779 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

15、JPA中的联合主键

阅读更多


      两个或多个字段组成的主键,我们叫联合主键。在面向对象中,我们用JPA怎么定义这种情况呢?
      怎么定义联合主键?用面向对象的思想来思考的话,联合主键里的复合主键(字段),可以把它看成一个整体,然后采用一个主键类来描述这个复合主键的字段。

关于联合主键类,大家一定要遵守以下几点JPA规范:

  1. 必须提供一个public的无参数构造函数。
  2. 必须实现序列化接口。
  3. 必须重写hashCode()和equals()这两个方法。这两个方法应该采用复合主键的字段作为判断这个对象是否相等的。
  4. 联合主键类的类名结尾一般要加上PK两个字母代表一个主键类,不是要求而是一种命名风格。




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

 

字段生成了,看图:



 
看主键,两个字段,看图:符合主键的定义就OK:


 
数据也添加进去了,看图:


 

  • 大小: 25.8 KB
  • 大小: 20.1 KB
  • 大小: 17.3 KB
分享到:
评论

相关推荐

    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中的联合主键

    NULL 博文链接:https://1028826685.iteye.com/blog/1525788

    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种方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

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

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

    jPA+hibernate

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

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

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

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

     第15章 高级查询选项   15.1 利用条件和示例查询   15.1.1 基本的条件查询   15.1.2 联结和动态抓取   15.1.3 投影和报表查询   15.1.4 按示例查询   15.2 利用原生的SQL查询   15.2.1 自动的结果集...

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

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

    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