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

JPA中复合主键的映射

    博客分类:
  • JPA
阅读更多

在航空系统中,航线有出发城市和到达城市复合主键确定 一个航线可以有多个航班 所以航班对航线是多对一的关系。维护端为航班。由于航线的主键为复合主键,在航班类中要引用航线的主键做为外键 该怎么使用呢?下面是用法:

1、创建复合主键类

需要实现序列化接口和重写hashcode和equals方法

Jpa注解的用法见代码吧:

package cn.itcast.bean;

import java.io.Serializable;

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

@Embeddable
public class AirLinePK implements Serializable{//JPA叫它作主键类
	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;
		final 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、创建航线类

package cn.itcast.bean;

import java.util.HashSet;
import java.util.Set;

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

@Entity
public class AirLine {
	private AirLinePK id;
	private Boolean onpp = true; //是否在飞
	private Set<Filght> filghts = new HashSet<Filght>();
	
	@OneToMany(mappedBy="airLine", cascade=CascadeType.REFRESH)
	public Set<Filght> getFilghts() {
		return filghts;
	}

	public void setFilghts(Set<Filght> filghts) {
		this.filghts = filghts;
	}

	public AirLine(){}
	
	public AirLine(AirLinePK id) {
		this.id = id;
	}
	
	public AirLine(String startcity, String endcity) {
		this.id = new AirLinePK(startcity, endcity);
	}
	
	@EmbeddedId    //复合主键的注解方法
	public AirLinePK getId() {//必须实现序列化接口
		return id;
	}
	public void setId(AirLinePK id) {
		this.id = id;
	}
	@Column(nullable=false)
	public Boolean getOnoff() {
		return onpp;
	}
	public void setOnoff(Boolean onoff) {
		this.onpp = onoff;
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.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 AirLine other = (AirLine) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}
	
}

 3、航班的代码

package cn.itcast.bean;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.ManyToOne;

@Entity
public class Filght {
	private String filghtno;
	private String aircompany;
	private AirLine airLine;
	
	@ManyToOne(cascade=CascadeType.REFRESH, optional=false)
	@JoinColumns({//设置外键的名称和各自对应的外键类里的属性。想想加入不设置,程序怎么知道谁对应谁呀
		@JoinColumn(name="startcity", referencedColumnName="startcity"),
		@JoinColumn(name="endcity", referencedColumnName="endcity")
	})
	public AirLine getAirLine() {
		return airLine;
	}
	public void setAirLine(AirLine airLine) {
		this.airLine = airLine;
	}
	@Id @Column(length=6)
	public String getFilghtno() {
		return filghtno;
	}
	public void setFilghtno(String filghtno) {
		this.filghtno = filghtno;
	}
	@Column(length=2)
	public String getAircompany() {
		return aircompany;
	}
	public void setAircompany(String aircompany) {
		this.aircompany = aircompany;
	}
	
}

 测试代码

@Test
	public void save(){
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		AirLine airLine = new AirLine("PEK", "CAN");
		em.persist(airLine);
		
		Filght filght = new Filght();
		filght.setFilghtno("CA1002");
		filght.setAircompany("CA");
		filght.setAirLine(airLine);
		em.persist(filght);
		
		em.getTransaction().commit();
		em.close();
		factory.close();
	}

 

分享到:
评论
1 楼 xiangpi1991 2015-04-18  
如果复合主键中的属性并不是两个String类型的属性,而是两个比如是:学生和课程这两个实体类型,也就是说如果复合主键中的属性是外键的话,这个其中的注解又该如何配置呢,还有我更想问的是,如果当我要删除一个学生的时候,我希望能级联地删除这个含有学生与课程这两个类的主键的关联表,谢谢!

相关推荐

    JPA映射关系详解javax JPA JPA映射关系 JPA映射

    ### JPA映射关系详解 ...在上面的例子中,`RoleMember` 类代表了 `SYS_ROLE_MEMBER` 中间表,其中包含了复合主键 `RoleMemberPK` 和额外的 `SIGN` 字段。这种方式更灵活,可以用来存储额外的信息。

    hibernate复合主键设置

    在Hibernate的映射文件(XML方式)或者使用JPA注解(Java方式)中,需要为复合主键提供相应的配置。对于XML配置,你可能会看到类似以下的设置: ```xml &lt;!-- 其他属性的映射 --&gt; ``` 而在JPA注解...

    05_JPA详解_日期_枚举等字段类型的JPA映射.zip

    主键的映射可以使用`@Id`,复合主键则使用`@IdClass`或`@EmbeddedId`。 ### 6. 映射关系 JPA提供了多种关系映射方式,如一对一(@OneToOne)、一对多(@OneToMany)、多对一(@ManyToOne)和多对多(@ManyToMany)...

    Hibernate复合主键.

    在编写HQL或JPA Criteria查询时,复合主键的使用方式与其他字段并无太大区别,只需要按照其结构进行匹配即可。在一对多或多对一的关系映射中,如果关联的主键是复合的,需要在`@ManyToOne`或`@OneToMany`注解中指定`...

    学习hibernate必读,JPA2新特征和JPA2映射的神秘之旅。

    - **复合主键**:`@EmbeddedId`和`@IdClass`用于处理复杂的主键结构。 - **继承映射**:支持单表继承(Single Table Inheritance)、联合继承(Joined Table Inheritance)和表-per-class-hierarchy策略。 - **...

    JPA 黎活明JPA视频代码

    在JPA中,可以通过实现`javax.persistence.Embeddable`接口来定义复合主键类,并在实体类中使用`@EmbeddedId`注解来指定。 2. **JPAtest**:这可能是用于进行JPA基本操作的测试项目,如CRUD(创建、读取、更新、...

    JPA批注参考(主要介绍JPA中的相关注解)

    Java Persistence API (JPA) 是 Java 平台中用于处理对象关系映射(ORM)的标准接口。它简化了 Java 应用程序与关系型数据库之间的交互,使得开发者能够以面向对象的方式来操作数据库。本文将详细介绍 JPA 中的主要...

    Pro JPA 2版

    在第十章“Advanced Object-Relational Mapping”中,作者将探讨如何处理更复杂的对象关系映射场景,例如多对多关系、继承映射、复合主键映射等。 6. 高级查询和XML映射文件 第十一章“Advanced Queries”和第十...

    hibernate3 注释生成复合主键或者嵌入式主键的方法及实例.doc

    通过这种方式,Hibernate将知道如何处理`UserRole`类,将其映射到具有复合主键的数据库表。 3. 嵌入式主键(Embedded Id): 如果希望将主键字段作为实体类的一部分,而不是单独的类,可以使用`@EmbeddedId`和`@...

    传智播客JPA学习笔记.pdf

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

    JPA标签(注解)详细说明

    Java 持续性API(JPA)是Java平台上的一个规范,用于处理对象关系映射(ORM),它简化了企业级Java应用中对数据库的访问。JPA允许开发者使用面向对象的编程模型来操作数据库,而无需深入理解底层的SQL语法。在JPA中...

    JPA实体关联(hibernate实现)

    在JPA中,我们可以创建一个专门的类来代表复合主键,并使用`@IdClass`注解标记这个类。每个主键字段都需要在复合主键类中声明,并用`@Id`注解。然后,在实体类中,将这个复合主键类作为属性并用`@EmbeddedId`注解。 ...

    JPA 标注 JPA标签手册

    - `@EmbeddedId`:当实体使用复合主键时,标识复合主键类。 - `@Inheritance`:控制继承策略,如单一表继承或多表继承。 2. **属性映射(Attribute Mapping)**: - `@Basic`:用于基本类型的字段,表明其为简单...

    JPA详细文档(JPA 批注参考)

    - `@EmbeddedId` 和 `@IdClass`:用于复合主键的定义。 4. **直接映射批注**: - `@Basic`:基本类型或枚举类型的默认映射。 - `@Temporal`:处理日期和时间类型的映射。 - `@Lob`:用于大对象(LOB)如BLOB和...

    JPA全面讲解

    如果实体使用复合主键,可以使用`@EmbeddedId`或`@IdClass`。 3. 直接映射:`@Basic`批注用于基本类型的映射,`@Temporal`用于日期时间类型,`@Lob`用于大对象(BLOB/CLOB),`@Transient`则标记不需持久化的字段。...

    JPA 2.0jar包及JPA2.0源代码

    5. **复合主键**:支持复合主键,可以由多个属性组成,方便处理复杂的主键结构。 6. **延迟加载(Lazy Loading)**:默认情况下,关联关系在需要时才加载,以提高性能。 7. **实体监听器(Entity Listeners)**:...

    jpa 批注参考 doc 格式 提供了一个对象关系映射方法

    - `@OrderBy`:在集合映射中,指定排序规则。 6. **组合**: - `@Embeddable`:定义一个可嵌入的类,其属性可以被其他实体包含。 - `@Embedded`:在实体类中嵌入一个`Embeddable`类。 - `@AttributeOverride`、...

    Openjpa手册

    - **实体身份**:实体的身份可以通过主键(Primary Key)或者复合主键(Composite Primary Key)来确定。 - **主键类**:如果实体使用复合主键,则需要定义一个主键类。 - **主键层次结构**:在继承场景下,主键的...

    JPA底层

    深入理解JPA,需要掌握实体关系的映射、懒加载和级联操作、多态性、继承、复合主键、集合映射等高级特性。同时,了解如何结合Spring框架使用JPA,以及在实际项目中优化JPA的性能,例如缓存策略、批处理操作等,都是...

    java JPA 批注参考

    - `@IdClass` 和 `@EmbeddedId`:用于复合主键。 4. **直接映射批注**: - `@Basic`:标记基本类型或引用类型的属性,进行简单的值映射。 - `@Temporal`:处理日期和时间类型,如`java.util.Date`和`java.time....

Global site tag (gtag.js) - Google Analytics