现在的位置: 首页 > 综合 > 正文

jpa的联合主键,级联操作和延迟加载

2014年11月10日 ⁄ 综合 ⁄ 共 2001字 ⁄ 字号 评论关闭

联合主键

两个或多个字段组成的主键叫做联合主键

在面向对象描述

符合主键类的jpa的规范

1.必须提供public无参的构造函数

2.实现序列化接口(serializable)

3.必须重写hashCode()和equals()方法,用符合字段作为两个方法的参数

联合主键类代码

package other.test;

import java.io.Serializable;

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

@Embeddable
public class AirlinePK implements Serializable {
	@Column(length = 10)
	private String start;
	@Column(length = 10)
	private String end;

	public String getStart() {
		return start;
	}

	public void setStart(String start) {
		this.start = start;
	}

	public String getEnd() {
		return end;
	}

	public void setEnd(String end) {
		this.end = end;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((end == null) ? 0 : end.hashCode());
		result = prime * result + ((start == null) ? 0 : start.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;
		AirlinePK other = (AirlinePK) obj;
		if (end == null) {
			if (other.end != null)
				return false;
		} else if (!end.equals(other.end))
			return false;
		if (start == null) {
			if (other.start != null)
				return false;
		} else if (!start.equals(other.start))
			return false;
		return true;
	}

}

实体类代码

package other.test;

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

@Entity
public class Airline {
	@EmbeddedId
	private AirlinePK id;
	@Column(length = 10)
	private String name;

	public AirlinePK getId() {
		return id;
	}

	public void setId(AirlinePK id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}

结果截图

级联操作

注:对于1-m关系,多的一方为关系维护端,关系维护端负责外键记录的更新,关系被维护端没有权利更新外键记录
级联cascade
CascadeType有几种方式
MERGE:级联更新(合并)---update---对EntityManager为方法:merge()
PERSIST:级联保存----save---对EntityManager为方法:persist()
REFRESH:级联刷新---select---对EntityManager为方法:refresh()
REMOVE:级联删除--delete----对EntityManager为方法:remove()
ALL:所有的都级联实体的状态  

延迟加载

加载fetch
FetchType有两种方式
LAZY:延迟加载---为了提高数据库效率,在加载对象的时候并不立即加载它的级联对象
EAGER:立即加载

实体对象的状态

实体对象拥有以下4 个状态,这些状态通过调用EntityManager 接口方法发生迁
移:  
新建态:新创建的实体对象,尚未拥有持久化主键,没有和一个持久化上下文关联
起来。  
 
受控态:已经拥有持久化主键并和持久化上下文建立了联系;  
 
游离态:拥有持久化主键,但尚未和持久化上下文建立联系;  
 
删除态:拥有持久化主键,已经和持久化上下文建立联系,但已经被安排从数据库
中删除。

抱歉!评论已关闭.