zoukankan      html  css  js  c++  java
  • hibernate映射关系之多对多

      多对多:
      * 关系在第三张表中,和两张表本身没有关系
      * 多对多谁维护关系:谁都能维护关系(效率是一样的),一般情况下可以通过页面
      来体现
      * 关系体现:
      第三张表的维护:增加、删除
      course类对应的映射文件
      <?xml version="1.0" encoding="utf-8"?>
      <!--
      Mapping file autogenerated by MyEclipse Persistence Tools
      -->
      <HIBERNATE-MAPPING>
      <CLASS name="manytomany.Course">
      <ID name="cid" length="5" type="java.lang.Long">
      <COLUMN name="cid"></COLUMN>
      <GENERATOR class="increment"></GENERATOR>
      </ID>
      <property name="cname" length="50" type="java.lang.String"></property>
      <property name="description" length="50" type="java.lang.String"></property>
      <!--
      table 指的是多对多的第三张表
      -->
      <SET name="students" inverse="true" cascade="save-update" table="student_course">
      <KEY>
      <COLUMN name="cid"></COLUMN>
      </KEY>
      <MANY-TO-MANY class=.manytomany.Student column="sid"></MANY-TO-MANY>
      </SET>
      </CLASS>
      </HIBERNATE-MAPPING>
      student表对应的映射文件
      <?xml version="1.0" encoding="utf-8"?>
      <!--
      Mapping file autogenerated by MyEclipse Persistence Tools
      -->
      <HIBERNATE-MAPPING>
      <CLASS name="manytomany.Student">
      <ID name="sid" length="5" type="java.lang.Long">
      <COLUMN name="sid"></COLUMN>
      <GENERATOR class="increment"></GENERATOR>
      </ID>
      <property name="sname" length="50" type="java.lang.String"></property>
      <property name="description" length="50" type="java.lang.String"></property>
      <!--
      table 指的是多对多的第三张表
      -->
      <SET name="course" cascade="save-update" table="student_course">
      <KEY>
      <COLUMN name="sid"></COLUMN>
      </KEY>
      <MANY-TO-MANY class="manytomany".Course column="cid"></MANY-TO-MANY>
      </SET>
      </CLASS>
      </HIBERNATE-MAPPING>
      多对多情况示例
      import java.lang.annotation.Target;
      import java.util.HashSet;
      import java.util.Set;
      import org.hibernate.Session;
      import org.hibernate.SessionFactory;
      import org.hibernate.Transaction;
      import org.hibernate.cfg.Configuration;
      import org.junit.Test;
      /**
      * 1、保存课程
      * 2、保存学生
      * 3、保存课程的时候同时保存学生
      * 4、保存课程的时候同时保存学生,并且建立课程和学生之间的关系
      * 5、已经存在一个课程,新建一个学生,并且建立该学生和该课程之间的关系
      * 6、已经存在一个学生,新建一个课程,并且建立该学生和该课程之间的关系
      * 7、已经存在一个学生,已经存在一个班级,解除该学生和原来班级之间的关系,建立该学生和新班级之间的关系
      * 8、已经存在一个学生,解除该学生和该学生所在班级之间的关系 www.yzyxedu.com
      * 9、解除该班级和所有的学生之间的关系,再重新建立该班级和一些新的学员之间的关系
      * 10、解除该班级和所有的学生之间的关系
      * 11、删除班级
      * *
      * * 解除该班级和所有的学生之间的关系
      * * 删除该班级
      * *
      * 删除班级的同时删除学生
      * 12、删除学生
      * 同删除班级
      * @author Administrator
      *
      */
      public class ManyToManyTest {
      private static SessionFactory sessionFactory = null;
      static{
      Configuration configuration = new Configuration();
      configuration.configure("cn/itcast/hibernate0909/manytomany/hibernate.cfg.xml");
      sessionFactory = configuration.buildSessionFactory();
      }
      /**
      * 保存课程
      */
      @Test
      public void testSaveCourse(){
      Session session = sessionFactory.openSession();
      Transaction transaction = session.beginTransaction();
      Course course = new Course();
      course.setCname("生理卫生");
      course.setDescription("讲得都是讲卫生的");
      session.save(course);
      transaction.commit();
      session.close();
      }
      /**
      * 保存学生
      */
      @Test
      public void testSaveStudent(){
      Session session = sessionFactory.openSession();
      Transaction transaction = session.beginTransaction();
      Student student = new Student();
      student.setSname("里活命");
      student.setDescription("UFO");
      session.save(student);
      transaction.commit();
      session.close();
      }
      /**
      * 保存课程同时保存学生
      * Hibernate: select max(cid) from Course
      Hibernate: select max(sid) from Student
      Hibernate: insert into Course (cname, description, cid) values (?, ?, ?)
      Hibernate: insert into Student (sname, description, sid) values (?, ?, ?)
      往Course表和Student表中分别插入了一行数据,和关系表没有关系
      通过映射文件可以看出,Student维护关系,但是从代码中找不到维护关系的代码
      */
      @Test
      public void testSaveCourse_Cascade(){
      Session session = sessionFactory.openSession();
      Transaction transaction = session.beginTransaction();
      /*
      * 新建一个课程
      */
      Course course = new Course();
      course.setCname("java基础");
      course.setDescription("讲课");
      /**
      * 新建一个学生
      */
      Student student = new Student();
      student.setSname("得意门生:西门庆");
      student.setDescription("高手");
      Set<STUDENT> students = new HashSet<STUDENT>();
      students.add(student);
      /**
      * 通过课程建立课程与学生之间的关系
      */
      course.setStudents(students);//因为课程是一个新的,所以根据没有学生
      session.save(course);
      transaction.commit();
      session.close();
      }
      /**
      * 保存课程同时保存学生,并且建立关系
      */
      @Test
      public void testSaveCourse_Cascade_R(){
      Session session = sessionFactory.openSession();
      Transaction transaction = session.beginTransaction();
      /**
      * 新建课程
      */
      Course course = new Course();
      course.setCname("java高级");
      course.setDescription("专讲框架,由金云龙代课");
      Set<COURSE> courses = new HashSet<COURSE>();
      courses.add(course);
      /**
      * 新建学生
      */
      Student student = new Student();
      student.setSname("班长");
      student.setDescription("高手,元方,你怎么看?");
      /*
      * 通过学生建立学生和课程之间的关系
      */
      student.setCourse(courses);
      session.save(student);
      transaction.commit();
      session.close();
      }
      /**
      * 已经存在一个课程,新建一个学生,并且建立该学生和该课程之间的关系
      * Hibernate: select course0_.cid as cid0_0_, course0_.cname as cname0_0_, course0_.description as descript3_0_0_ from Course course0_ where course0_.cid=?
      Hibernate: select max(sid) from Student www.yzyedu.com
      Hibernate: insert into Student (sname, description, sid) values (?, ?, ?)
      Hibernate: insert into student_course (sid, cid) values (?, ?)
      该sql语句是维护关系
      */
      @Test
      public void testSaveStudent_R(){
      Session session = sessionFactory.openSession();
      Transaction transaction = session.beginTransaction();
      /**
      * 1、查找一个课程
      * 2、新建一个学生
      * 3、通过学生来维护该学生和课程之间的关系
      */
      //查找课程2
      Course course = (Course)session.get(Course.class, 2L);
      //新建一个学生
      Student student = new Student();
      student.setSname("意门生");
      student.setDescription("aa");
      //通过学生来维护该学生和课程之间的关系
      Set<COURSE> courses = new HashSet<COURSE>();
      courses.add(course);
      student.setCourse(courses);
      session.save(student);
      transaction.commit();
      session.close();
      }
      /**
      * 已经存在一个学生,新建一个课程,并且建立该学生和该课程之间的关系
      */
      @Test
      public void testSaveCourse_R(){
      Session session = sessionFactory.openSession();
      Transaction transaction = session.beginTransaction();
      /**
      * 1、新建一个课程
      * 2、查找学生托福答案
      * 3、在学生原来的基础上新添加一门课程
      */
      //新建课程
      Course course = new Course();
      course.setCname("项目课");
      course.setDescription("得意门生");
      //查找学生
      Student student = (Student)session.get(Student.class, 5L);
      Set<COURSE> courses = student.getCourse();//获取该学生现在所有的课程
      courses.add(course);
      transaction.commit();
      session.close();
      }
      }

  • 相关阅读:
    awk使用
    SQL VIEW(视图)
    crontab使用
    SecureCRT
    Python异常
    Python字符串
    Python字典,列表,元组
    Python路径
    vim插件
    Python类
  • 原文地址:https://www.cnblogs.com/haosola/p/3660440.html
Copyright © 2011-2022 走看看