联合主键
两个或多个字段组成的主键叫做联合主键
在面向对象描述
符合主键类的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 接口方法发生迁移:
新建态:新创建的实体对象,尚未拥有持久化主键,没有和一个持久化上下文关联
起来。
受控态:已经拥有持久化主键并和持久化上下文建立了联系;
游离态:拥有持久化主键,但尚未和持久化上下文建立联系;
删除态:拥有持久化主键,已经和持久化上下文建立联系,但已经被安排从数据库
中删除。