Hibernate学习系列————注解多对多实例

需求分析:学生和教师之间存在多对多的关系

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

转载于:https://my.oschina.net/u/2509896/blog/760808

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值