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