需求分析:学生和教师之间存在多对多的关系
Student2类:
package cn.dao;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
@Entity
@Table (name = "student2")
public class Student2 implements Serializable{
private Long id;
private String name;
private String description;
private Set<Teacher> teachers = new HashSet<Teacher>();
@Id
@GeneratedValue (strategy = GenerationType.AUTO)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Column (name = "name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Column (name = "description")
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "teacher_student",joinColumns={ @JoinColumn(name = "studentId" ,nullable = false, updatable = false)},inverseJoinColumns={@JoinColumn (name = "teacherId",nullable = false,updatable = false)})
public Set<Teacher> getTeachers() {
return teachers;
}
public void setTeachers(Set<Teacher> teachers) {
this.teachers = teachers;
}
}
Teacher 类:
package cn.dao;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
@Entity
@Table (name = "teacher")
public class Teacher implements Serializable {
private Long id;
private String name;
private String description;
private Set<Student2> students = new HashSet<Student2>();
@Id
@GeneratedValue (strategy = GenerationType.AUTO)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Column(name = "name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Column(name = "description")
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@ManyToMany
@JoinTable(name = "teacher_student",joinColumns={ @JoinColumn(name = "teacherId",nullable = false,updatable = false)},inverseJoinColumns={ @JoinColumn( name = "studentId",nullable = false,updatable = false)})
public Set<Student2> getStudents() {
return students;
}
public void setStudents(Set<Student2> students) {
this.students = students;
}
}
ManyToMany类:
package cn.test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.Transaction;
import cn.dao.Student2;
import cn.dao.Teacher;
import cn.utils.HibernateUtil;
/**
* 多对多的操作
* @author hasee
*
*/
public class ManyToMany {
public static void main(String[] args) {
edit();
}
public static void save(){
//一个学生,拥有多个老师,一个老师,也拥有多个学生
Session session = HibernateUtil.getSession();
Transaction transcation = session.beginTransaction();
Student2 studentOne = new Student2();
studentOne.setName("Amumu");
studentOne.setDescription("This is Amumu");
Set<Teacher> teachers = new HashSet<Teacher>();
Teacher t1 = new Teacher();
Teacher t2 = new Teacher();
t1.setName("Teacher Wang");
t1.setDescription("Teacher Wang is Women");
t2.setName("Teacher Chen");
t2.setDescription("Teacher Chen is Man");
teachers.add(t1);
teachers.add(t2);
studentOne.setTeachers(teachers);
session.save(t1);
session.save(t2);
session.save(studentOne);
transcation.commit();
HibernateUtil.closeSession();
}
public static void save2(){
//添加一个学生时,为其添加指定的老师(分析:现数据库里有ID为1和2的老师,把这个学生添加到老师1中)
Session session = HibernateUtil.getSession();
Transaction transcation = session.beginTransaction();
Student2 student = new Student2();
student.setName("Jary");
student.setDescription("Jary is a new Student");
//此时Jary指定要到ID为1的老师
Set<Teacher> teachers = new HashSet<Teacher>();
Teacher teacher = (Teacher) session.get(Teacher.class, 12L);
teachers.add(teacher);
student.setTeachers(teachers);//有点一对多的意思
session.save(student);
transcation.commit();
HibernateUtil.closeSession();
}
public static void edit(){
//根据学生的ID,改变和原有老师的关联关系
Session session = HibernateUtil.getSession();
Transaction transcation = session.beginTransaction();
Student2 student = (Student2) session.get(Student2.class, 10L);//根据ID查出当前的学生
//查出当前的学生拥有几个老师,打印出老师的名字和ID
Set<Teacher> teachers = student.getTeachers();
List<Teacher> list=new ArrayList<Teacher>(teachers);
for (Teacher teacher : list) {
System.out.println("老师的ID为:"+teacher.getId()+" 老师的名字为:"+teacher.getName());
//解除ID为12,11的老师关联
if(teacher.getId()==12 || teacher.getId()==11){
teachers.remove(teacher);
}
}
teachers = new HashSet<>(list);
session.update(student);
transcation.commit();
HibernateUtil.closeSession();
}
public static void delete(){
Session session = HibernateUtil.getSession();
Transaction transcation = session.beginTransaction();
//直接根据学生ID删除学生 或者 根据 老师ID删除老师
// Student2 student = (Student2) session.get(Student2.class, 4L);
// session.delete(student);
// Teacher teacher = (Teacher) session.get(Teacher.class, 3L);
// session.delete(teacher);
//删除ID为4的老师下的全部学生
Teacher teacher = (Teacher) session.get(Teacher.class, 4L);
Set<Student2> students = teacher.getStudents();
for (Student2 student2 : students) {
session.delete(student2);
}
transcation.commit();
HibernateUtil.closeSession();
}
}