今天为了要完成一个多对多的操作功能,做了一个下面的测试,现将代码贴出:
- package com.myHibernate.vo;
- import java.util.Set;
- import javax.persistence.CascadeType;
- 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.ManyToOne;
- import javax.persistence.SequenceGenerator;
- import javax.persistence.Table;
- @Entity
- @Table(name="STUDENTS")
- @SequenceGenerator(name="SEQ_STUDENTS",sequenceName="SEQ_STUDENTS",allocationSize=1,initialValue=1)
- public class Student {
- private Long id;
- private String code;
- private String name;
- // @Column(name="TECH_ID")
- // private Long techId;
- // private Teacher teacher;
- private Set<Course> courses;
- @Id
- @GeneratedValue(generator="SEQ_STUDENTS",strategy=GenerationType.SEQUENCE)
- @Column(name="id")
- public Long getId() {
- return id;
- }
- public void setId(Long id) {
- this.id = id;
- }
- @Column(name="CODE")
- public String getCode() {
- return code;
- }
- public void setCode(String code) {
- this.code = code;
- }
- @Column(name="NAME")
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- // public Long getTechId() {
- // return techId;
- // }
- // public void setTechId(Long techId) {
- // this.techId = techId;
- // }
- // @ManyToOne()
- // @JoinColumn(name="TECH_ID")
- // public Teacher getTeacher() {
- // return teacher;
- // }
- // public void setTeacher(Teacher teacher) {
- // this.teacher = teacher;
- // }
- @ManyToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY)
- @JoinTable(name="STUDENTS_COURSES",joinColumns=@JoinColumn(name="FK_STU_ID"),
- inverseJoinColumns=@JoinColumn(name="FK_COU_ID"))
- public Set<Course> getCourses() {
- return courses;
- }
- public void setCourses(Set<Course> courses) {
- this.courses = courses;
- }
- }
- package com.myHibernate.vo;
- 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.ManyToMany;
- import javax.persistence.SequenceGenerator;
- import javax.persistence.Table;
- @Entity
- @Table(name="COURSES")
- @SequenceGenerator(name="SEQ_COURSES",sequenceName="SEQ_COURSES",allocationSize=1)
- public class Course {
- @Id
- @GeneratedValue(generator="SEQ_COURSES",strategy=GenerationType.SEQUENCE)
- @Column(name="ID")
- private Long id;
- @Column(name="CODE")
- private String code;
- @Column(name="NAME")
- private String name;
- @ManyToMany(mappedBy="courses")
- private Set<Student> students;
- public Long getId() {
- return id;
- }
- public void setId(Long id) {
- this.id = id;
- }
- public String getCode() {
- return code;
- }
- public void setCode(String code) {
- this.code = code;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public Set<Student> getStudents() {
- return students;
- }
- public void setStudents(Set<Student> students) {
- this.students = students;
- }
- }
- package com.myHibernate.test;
- import java.util.HashSet;
- import java.util.Set;
- import org.hibernate.Session;
- import org.hibernate.SessionFactory;
- import org.hibernate.Transaction;
- import org.hibernate.cfg.AnnotationConfiguration;
- import com.myHibernate.vo.Course;
- import com.myHibernate.vo.Student;
- public class ManyToManyTest {
- /**
- * @param args
- */
- public static void main(String[] args) {
- SessionFactory sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
- Session session = sessionFactory.openSession();
- Transaction trans = session.beginTransaction();
- Set<Student> sList = new HashSet<Student>();
- Student s0 = new Student();
- s0.setCode("000001");
- s0.setName("xioali");
- sList.add(s0);
- Student s1 = new Student();
- s1.setCode("000002");
- s1.setName("zhangsan");
- sList.add(s1);
- Set<Course> cList = new HashSet<Course>();
- Course c0 = new Course();
- c0.setCode("0001");
- c0.setName("语文");
- cList.add(c0);
- Course c1 = new Course();
- c1.setCode("0002");
- c1.setName("数学");
- cList.add(c1);
- s1.setCourses(cList);
- s0.setCourses(cList);
- session.save(s0);
- session.save(s1);
- // Student s = (Student)session.load(Student.class, 36L);
- // String hql = "delete Course c from c where c.students.id = ?";
- // session.createQuery(hql).setLong(0, 36L).executeUpdate();
- // Set<Course> courses = new HashSet<Course>();
- // Course c0 = (Course)session.load(Course.class, 7L);
- // Course c1 = (Course)session.load(Course.class, 8L);
- // courses.add(c0);
- // courses.add(c1);
- // s.setCourses(courses);
- // s.setCourses(null);
- // session.update(s);
- trans.commit();
- }
- }
要删除中间表的数据的代码如下:
- Student s = (Student)session.load(Student.class, 36L);
- s.setCourses(null);
- session.update(s);
要恢复中间表中被删除的数据的代码如下:
- Student s = (Student)session.load(Student.class, 36L);
- Set<Course> courses = new HashSet<Course>();
- Course c0 = (Course)session.load(Course.class, 7L);
- Course c1 = (Course)session.load(Course.class, 8L);
- courses.add(c0);
- courses.add(c1);
- session.update(s);