第十六章 JPA關聯關係

    類與類最直接的關係就是關聯關係

 

多對一,一對多:雙項

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();
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章