雙向多對多的ddl語句
同單向多對多表的ddl語句一致
Student
package com.jege.jpa.many2many;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
/**
* @author JE哥
* @email 1272434821@qq.com
* @description:雙向:關(guān)系被維護端:不能操作中間表
*/
@Entity
@Table(name = "t_student")
public class Student {
@Id
@GeneratedValue
private Long id;
private String sname;
@ManyToMany(mappedBy = "students")
private Set<Teacher> teachers = new HashSet<Teacher>();
public Student() {
}
public Student(String sname) {
this.sname = sname;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public Set<Teacher> getTeachers() {
return teachers;
}
public void setTeachers(Set<Teacher> teachers) {
this.teachers = teachers;
}
@Override
public String toString() {
return "Student [id=" + id + ", sname=" + sname + "]";
}
}
Teacher
package com.jege.jpa.many2many;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
/**
* @author JE哥
* @email 1272434821@qq.com
* @description:雙向:關(guān)系維護端:可以操作中間表
*/
@Entity
@Table(name = "t_teacher")
public class Teacher {
@Id
@GeneratedValue
private Long id;
private String tname;
// @ManyToMany注釋表示Teacher是多對多關(guān)系的一端。
// @JoinTable描述了多對多關(guān)系的數(shù)據(jù)表關(guān)系咖熟。name屬性指定中間表名稱,joinColumns定義中間表與Teacher表的外鍵關(guān)系。
// 中間表Teacher_Student的Teacher_ID列是Teacher表的主鍵列對應(yīng)的外鍵列推溃,inverseJoinColumns屬性定義了中間表與另外一端(Student)的外鍵關(guān)系。
@ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
@JoinTable(name = "t_teacher_student", joinColumns = { @JoinColumn(name = "teacher_id") }, inverseJoinColumns = {
@JoinColumn(name = "student_id") })
private Set<Student> students = new HashSet<Student>();
public Teacher() {
}
public Teacher(String tname) {
this.tname = tname;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getTname() {
return tname;
}
public void setTname(String tname) {
this.tname = tname;
}
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
}
@Override
public String toString() {
return "Teacher [id=" + id + ", tname=" + tname + "]";
}
}
Many2ManyTest
package com.jege.jpa.many2many;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
/**
* @author JE哥
* @email 1272434821@qq.com
* @description:雙向多對多Test
*/
public class Many2ManyTest {
private static EntityManagerFactory entityManagerFactory = null;
private EntityManager entityManager = null;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
entityManagerFactory = Persistence.createEntityManagerFactory("com.jege.jpa");
}
@Before
public void setUp() throws Exception {
entityManager = entityManagerFactory.createEntityManager();
}
// t1老師教2個學(xué)生s1,s2
// t2老師教3個學(xué)生s1,s2,s3
// 總共10條insert
@Test
public void persist() throws Exception {
entityManager.getTransaction().begin();
Teacher t1 = new Teacher("t1");
Teacher t2 = new Teacher("t2");
Student s1 = new Student("s1");
Student s2 = new Student("s2");
Student s3 = new Student("s3");
entityManager.persist(t1);
entityManager.persist(t2);
entityManager.persist(s1);
entityManager.persist(s2);
entityManager.persist(s3);// 全部發(fā)出5條insert單表
// 添加中間表
// t1老師教2個學(xué)生s1,s2
// t2老師教3個學(xué)生s1,s2,s3
t1.getStudents().add(s1);
t1.getStudents().add(s2);
t2.getStudents().add(s1);
t2.getStudents().add(s2);
t2.getStudents().add(s3);
entityManager.getTransaction().commit();// 發(fā)出5條insert中間表
entityManager.close();
}
// t1老師教2個學(xué)生s1,s2
// 修改為 教2個學(xué)生s1,s3:先刪除在添加
@Test
public void update() throws Exception {
persist();
entityManager.getTransaction().begin();
Teacher t1 = entityManager.find(Teacher.class, 1L);
Student s2 = entityManager.find(Student.class, 2L);
Student s3 = entityManager.find(Student.class, 3L);
// 刪除
t1.getStudents().remove(s2);
// 添加
t1.getStudents().add(s3);
entityManager.getTransaction().commit();
}
// 刪除t1的教的所有學(xué)生
@Test
public void delete() throws Exception {
persist();
entityManager.getTransaction().begin();
Teacher t1 = entityManager.find(Teacher.class, 1L);
t1.getStudents().clear();
entityManager.getTransaction().commit();
}
// insert 3條缎脾,單表插入,中間表無反應(yīng)
// 因為Student是關(guān)系被維護端:不能操作中間表
@Test
public void persist2() throws Exception {
Teacher teacher = new Teacher("t1");
Student student1 = new Student("s1");
Student student2 = new Student("s2");
student1.getTeachers().add(teacher);// 插入中間表
student2.getTeachers().add(teacher);
entityManager.getTransaction().begin();
entityManager.persist(teacher);
entityManager.persist(student1);
entityManager.persist(student2);
entityManager.getTransaction().commit();
}
@Test
public void find() throws Exception {
persist();
entityManager = entityManagerFactory.createEntityManager();
Teacher teacher = entityManager.find(Teacher.class, 1L);
System.out.println(teacher.getTname());
System.out.println("------------------");
System.out.println(teacher.getStudents());
}
@Test
public void find2() throws Exception {
persist();
entityManager = entityManagerFactory.createEntityManager();
Student student = entityManager.find(Student.class, 1L);
System.out.println(student.getSname());
System.out.println("------------------");
System.out.println(student.getTeachers());
}
@After
public void tearDown() throws Exception {
if (entityManager != null && entityManager.isOpen())
entityManager.close();
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
if (entityManagerFactory != null && entityManagerFactory.isOpen())
entityManagerFactory.close();
}
}
其他關(guān)聯(lián)項目
- ** JPA 菜鳥教程 6 單向多對多**
http://blog.csdn.net/je_ge/article/details/53495237
源碼地址
如果覺得我的文章或者代碼對您有幫助,可以請我喝杯咖啡深滚。
**您的支持將鼓勵我繼續(xù)創(chuàng)作!謝謝! **
微信打賞
支付寶打賞