类与类最直接的关系就是关联关系
多对一,一对多:双项
package com.entity;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Transient;
/*
* 班级表映射学生表:一对多
*/
@Entity
public class Classs {
private int sno;
private String cname;
private List<Student> students;
public Classs() {
super();
}
public Classs(int sno, String cname, List<Student> students) {
super();
this.sno = sno;
this.cname = cname;
this.students = students;
}
@GeneratedValue(strategy=GenerationType.AUTO)
@Id
public int getSno() {
return sno;
}
public void setSno(int sno) {
this.sno = sno;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
/*
* 体现一对多的关系,会在Student表添加cid字段,
* 通过cid建立两个表之间的关系,student表不需要注明关系
* 两表都有注解注明关系则为双项连接,可以相互连接查询
*/
@JoinColumn(name="cid")
@OneToMany
public List<Student> getStudents() {
return students;
}
public void setStudents(List<Student> students) {
this.students = students;
}
@Override
public String toString() {
return "Classs [sno=" + sno + ", cname=" + cname + "]";
}
}
package com.entity;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
/*
* 学生表映射班级:多对一
*/
@Entity
public class Student {
private int stuno;
private String sname;
private int score;
private Classs classs;
public Student() {
super();
}
public Student(int stuno, String sname, int score, Classs classs) {
super();
this.stuno = stuno;
this.sname = sname;
this.score = score;
this.classs = classs;
}
@GeneratedValue(strategy=GenerationType.AUTO)
@Id
public int getStuno() {
return stuno;
}
public void setStuno(int stuno) {
this.stuno = stuno;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
/*
* 体现多对一的关系,会在Student表添加cid字段,
* 通过cid建立两个表之间的关系,classs表不需要注明关系
* 两表都有注解注明关系则为双项连接,可以相互连接查询
*/
@JoinColumn(name="cid")
@ManyToOne
public Classs getClasss() {
return classs;
}
public void setClasss(Classs classs) {
this.classs = classs;
}
@Override
public String toString() {
return "Student [stuno=" + stuno + ", sname=" + sname + ", score="
+ score + "]";
}
}
package com.test;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import com.entity.Classs;
import com.entity.Student;
/*
* 测试关系连接
*/
public class Test {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpa");
EntityManager em = emf.createEntityManager();
EntityTransaction et = em.getTransaction();
et.begin();
// 多对一 : 查询学生信息,会通过cid关系(关系建立在学生表:@ManyToOne),将查询出来的班级信息保存在对象中
Student stu = em.find(Student.class, 1);
// 获取学生对象中班级信息
Classs stuC = stu.getClasss();
System.out.println(stuC);
// 一对多:查询班级信息,会通过cid关系(关系建立在班级表:@OneToMany),将查询出来的信息保存在对象中
Classs cls= em.find(Classs.class, 1);
// 获取班级对象中学生信息
List<Student> cStus = cls.getStudents();
System.out.println(cStus);
et.commit();
em.close();
emf.close();
}
}
多对多
package com.entity;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
/*
* 员工表:一个员工可以有多个项目
*/
@Entity
public class Emp {
private int empno;
private String ename;
private List<Project> pros;
public Emp() {
super();
}
public Emp(int empno, String ename, List<Project> pros) {
super();
this.empno = empno;
this.ename = ename;
this.pros = pros;
}
@GeneratedValue(strategy=GenerationType.AUTO)
@Id
public int getEmpno() {
return empno;
}
public void setEmpno(int empno) {
this.empno = empno;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
@ManyToMany(targetEntity=Project.class)
public List<Project> getPros() {
return pros;
}
public void setPros(List<Project> pros) {
this.pros = pros;
}
@Override
public String toString() {
return "Emp [empno=" + empno + ", ename=" + ename + "]";
}
}
package com.entity;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
/*
* 项目表:一个项目可以有多个员工
*/
@Entity
public class Project {
private int pno;
private String pname;
private List<Emp> emps;
public Project() {
super();
}
public Project(int pno, String pname, List<Emp> emps) {
super();
this.pno = pno;
this.pname = pname;
this.emps = emps;
}
@GeneratedValue(strategy=GenerationType.AUTO)
@Id
public int getPno() {
return pno;
}
public void setPno(int pno) {
this.pno = pno;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
@ManyToMany(targetEntity=Emp.class)
public List<Emp> getEmps() {
return emps;
}
public void setEmps(List<Emp> emps) {
this.emps = emps;
}
@Override
public String toString() {
return "Project [pno=" + pno + ", pname=" + pname + "]";
}
}
package com.test;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import com.entity.Emp;
import com.entity.Project;
/*
* 测试关系连接
*/
public class Test {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpa");
EntityManager em = emf.createEntityManager();
EntityTransaction et = em.getTransaction();
et.begin();
/*
* 员工:zhang wang li
* 项目:A B
*
* A项目:zhang wang
* B项目:li wang
*/
// 创建员工
Emp zhang = new Emp(0, "zhang", null);
Emp wang = new Emp(0, "wang", null);
Emp li = new Emp(0, "li", null);
// 将员工存入数据库,但是员工所在项目为空
em.persist(zhang);
em.persist(wang);
em.persist(li);
// 整合项目所需人员
List<Emp> A_emp = new ArrayList<Emp>();
A_emp.add(zhang);
A_emp.add(wang);
List<Emp> B_emp = new ArrayList<Emp>();
B_emp.add(li);
B_emp.add(wang);
// 创建项目
Project A = new Project(0, "A", A_emp);
Project B = new Project(0, "B", B_emp);
// 将项目和项目所需对应员工信息存入数据库
em.persist(A);
em.persist(B);
//整合人员所在项目
List<Project> zhang_p = new ArrayList<Project>();
zhang_p.add(A);
List<Project> wang_p = new ArrayList<Project>();
wang_p.add(A);
wang_p.add(B);
List<Project> li_p = new ArrayList<Project>();
li_p.add(B);
// 修改数据库员工数据,将项目信息存入
zhang.setEmpno(1);
zhang.setPros(zhang_p);
wang.setEmpno(2);
wang.setPros(wang_p);
li.setEmpno(3);
li.setPros(li_p);
// 将员工和员工项目信息重新存入数据库
em.merge(zhang);
em.merge(wang);
em.merge(li);
et.commit();
em.close();
emf.close();
}
}