在航空系统中,航线有出发城市和到达城市复合主键确定 一个航线可以有多个航班 所以航班对航线是多对一的关系。维护端为航班。由于航线的主键为复合主键,在航班类中要引用航线的主键做为外键 该怎么使用呢?下面是用法:
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();
}
分享到:
相关推荐
### JPA映射关系详解 ...在上面的例子中,`RoleMember` 类代表了 `SYS_ROLE_MEMBER` 中间表,其中包含了复合主键 `RoleMemberPK` 和额外的 `SIGN` 字段。这种方式更灵活,可以用来存储额外的信息。
在Hibernate的映射文件(XML方式)或者使用JPA注解(Java方式)中,需要为复合主键提供相应的配置。对于XML配置,你可能会看到类似以下的设置: ```xml <!-- 其他属性的映射 --> ``` 而在JPA注解...
主键的映射可以使用`@Id`,复合主键则使用`@IdClass`或`@EmbeddedId`。 ### 6. 映射关系 JPA提供了多种关系映射方式,如一对一(@OneToOne)、一对多(@OneToMany)、多对一(@ManyToOne)和多对多(@ManyToMany)...
在编写HQL或JPA Criteria查询时,复合主键的使用方式与其他字段并无太大区别,只需要按照其结构进行匹配即可。在一对多或多对一的关系映射中,如果关联的主键是复合的,需要在`@ManyToOne`或`@OneToMany`注解中指定`...
- **复合主键**:`@EmbeddedId`和`@IdClass`用于处理复杂的主键结构。 - **继承映射**:支持单表继承(Single Table Inheritance)、联合继承(Joined Table Inheritance)和表-per-class-hierarchy策略。 - **...
在JPA中,可以通过实现`javax.persistence.Embeddable`接口来定义复合主键类,并在实体类中使用`@EmbeddedId`注解来指定。 2. **JPAtest**:这可能是用于进行JPA基本操作的测试项目,如CRUD(创建、读取、更新、...
Java Persistence API (JPA) 是 Java 平台中用于处理对象关系映射(ORM)的标准接口。它简化了 Java 应用程序与关系型数据库之间的交互,使得开发者能够以面向对象的方式来操作数据库。本文将详细介绍 JPA 中的主要...
在第十章“Advanced Object-Relational Mapping”中,作者将探讨如何处理更复杂的对象关系映射场景,例如多对多关系、继承映射、复合主键映射等。 6. 高级查询和XML映射文件 第十一章“Advanced Queries”和第十...
通过这种方式,Hibernate将知道如何处理`UserRole`类,将其映射到具有复合主键的数据库表。 3. 嵌入式主键(Embedded Id): 如果希望将主键字段作为实体类的一部分,而不是单独的类,可以使用`@EmbeddedId`和`@...
联合主键使用@EmbeddedId和@Embeddable注解,将多个字段组合成一个复合主键,适用于那些不满足单一主键条件的表。 以上就是JPA学习笔记中的关键知识点,涵盖了JPA的基本概念、环境配置、对象关系映射、查询语言、...
Java 持续性API(JPA)是Java平台上的一个规范,用于处理对象关系映射(ORM),它简化了企业级Java应用中对数据库的访问。JPA允许开发者使用面向对象的编程模型来操作数据库,而无需深入理解底层的SQL语法。在JPA中...
在JPA中,我们可以创建一个专门的类来代表复合主键,并使用`@IdClass`注解标记这个类。每个主键字段都需要在复合主键类中声明,并用`@Id`注解。然后,在实体类中,将这个复合主键类作为属性并用`@EmbeddedId`注解。 ...
- `@EmbeddedId`:当实体使用复合主键时,标识复合主键类。 - `@Inheritance`:控制继承策略,如单一表继承或多表继承。 2. **属性映射(Attribute Mapping)**: - `@Basic`:用于基本类型的字段,表明其为简单...
- `@EmbeddedId` 和 `@IdClass`:用于复合主键的定义。 4. **直接映射批注**: - `@Basic`:基本类型或枚举类型的默认映射。 - `@Temporal`:处理日期和时间类型的映射。 - `@Lob`:用于大对象(LOB)如BLOB和...
如果实体使用复合主键,可以使用`@EmbeddedId`或`@IdClass`。 3. 直接映射:`@Basic`批注用于基本类型的映射,`@Temporal`用于日期时间类型,`@Lob`用于大对象(BLOB/CLOB),`@Transient`则标记不需持久化的字段。...
5. **复合主键**:支持复合主键,可以由多个属性组成,方便处理复杂的主键结构。 6. **延迟加载(Lazy Loading)**:默认情况下,关联关系在需要时才加载,以提高性能。 7. **实体监听器(Entity Listeners)**:...
- `@OrderBy`:在集合映射中,指定排序规则。 6. **组合**: - `@Embeddable`:定义一个可嵌入的类,其属性可以被其他实体包含。 - `@Embedded`:在实体类中嵌入一个`Embeddable`类。 - `@AttributeOverride`、...
- **实体身份**:实体的身份可以通过主键(Primary Key)或者复合主键(Composite Primary Key)来确定。 - **主键类**:如果实体使用复合主键,则需要定义一个主键类。 - **主键层次结构**:在继承场景下,主键的...
深入理解JPA,需要掌握实体关系的映射、懒加载和级联操作、多态性、继承、复合主键、集合映射等高级特性。同时,了解如何结合Spring框架使用JPA,以及在实际项目中优化JPA的性能,例如缓存策略、批处理操作等,都是...
- `@IdClass` 和 `@EmbeddedId`:用于复合主键。 4. **直接映射批注**: - `@Basic`:标记基本类型或引用类型的属性,进行简单的值映射。 - `@Temporal`:处理日期和时间类型,如`java.util.Date`和`java.time....