zoukankan      html  css  js  c++  java
  • Hibernate多表关系配置——多对多对关系映射

    多对多关系:第一个表中的一个行可以与第二个表中的一个或多个行相关。第二个表中的一个行也可以与第一个表中的一个或多个行相关。

    一般的设计中,多对多关联映射,需要一个中间表 Hibernate使用many-to-many标签来表示多对多 多对多的关联映射,在实体类中,跟一对多一样,也是用集合来表示的

    1、实体

    1.1 课程实体

    package demo.entity;
    
    import java.util.HashSet;
    import java.util.Set;
    
    /**
     * 课程实体
     * @author Don
     * @date:日期:2017年4月11日 时间:下午2:25:45*
     * @version 1.0
     */
    public class Course {
        private String id;
        private String name;
        //课程中包含的学生列表
        private Set<Student> stus = new HashSet<>();
        public String getId() {
            return id;
        }
        public void setId(String id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public Set<Student> getStus() {
            return stus;
        }
        public void setStus(Set<Student> stus) {
            this.stus = stus;
        }
        
        public Course(){}
        
        public Course(String name) {
            this.setName(name);
        }
    }
    View Code

    1.2 学生实体

    package demo.entity;
    
    import java.util.HashSet;
    import java.util.Set;
    
    /**
     * 学生实体
     * @author Don
     * @date:日期:2017年4月11日 时间:下午2:25:15*
     * @version 1.0
     */
    public class Student {
        private String id;
        private String name;
        //学生选的课程列表
        private Set<Course> cous=new HashSet<>();
        public String getId() {
            return id;
        }
        public void setId(String id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public Set<Course> getCous() {
            return cous;
        }
        public void setCous(Set<Course> cous) {
            this.cous = cous;
        }
        
        public Student() {
            
        }
        
        public Student(String name) {
            this.setName(name);
        }
    }
    View Code

    2、关系映射配置

    2.1 课程实体映射

    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
        <!-- name:实体, table:表名 -->
        <class name="demo.entity.Course" table="m2m_1_course">
            <!-- name:主键的名字,column:主键数据库表列,identity自增 -->
            <id name="Id">
                <!-- 生成主键-->
                <generator class="uuid"></generator>
            </id>
            <!-- name:实体中的属性名,length:长度 ,column:表中的字段(实体属性和字段一致可省略),type:类型(可不写由hiberbate自动匹配) -->
            <property name="name" />
            
            <!-- 使用中间表的数据构建集合 -->
            <set name="stus" table="m2m_1_stu_cour" cascade="save-update">
                <!-- 中间表中记录当前类的列 -->
                <key column="cid"></key>
                <many-to-many class="demo.entity.Student" column="stuid"></many-to-many>
            </set>
        </class>
    </hibernate-mapping>

    2.2 学生实体映射

    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
        <!-- 在这个一对一的关系中,Person可以自己产生主键值 -->
        <!-- name:实体, table:表名 -->
        <class name="demo.entity.Student" table="m2m_1_student">
            <!-- name:主键的名字,column:主键数据库表列,identity自增 -->
            <id name="Id">
                <!-- Hibernate使用generator类来生成主键 -->
                <generator class="uuid" />
            </id>
            <!-- name:实体中的属性名,length:长度 ,column:表中的字段(实体属性和字段一致可省略),type:类型(可不写由hiberbate自动匹配) -->
            <property name="name"  />
            
            <!-- 使用中间表的数据构建集合 -->
            <set name="cous" table="m2m_1_stu_cour" cascade="save-update">
                <!-- 中间表中记录当前类的列 -->
                <key column="stuid"></key>
                <many-to-many class="demo.entity.Course" column="cid"></many-to-many>
            </set>
        </class>
    </hibernate-mapping>

    3、测试添加、删除

    package demo.test;
    
    import org.hibernate.classic.Session;
    
    import demo.entity.Course;
    import demo.entity.Student;
    import demo.util.HibernateUtil;
    
    public class TestSave {
    
        public static void main(String[] args) {
            
            Student stu1 = new Student("張三");
            Student stu2 = new Student("李四");
            Student stu3 = new Student("王五");
            
            Course c1 = new Course("C#");
            Course c2 = new Course("JAVA");
            Course c3 = new Course("PHP");
            Course c4 = new Course("Object-C");
            
            //学生添加选课
            stu1.getCous().add(c1);
            stu1.getCous().add(c2);
            
            stu2.getCous().add(c2);
            stu2.getCous().add(c4);
            
            stu3.getCous().add(c1);
            stu3.getCous().add(c2);
            stu3.getCous().add(c3);
            stu3.getCous().add(c3);
            
            Session session =  HibernateUtil.getCurrentSession();
            session.beginTransaction();
            
            session.save(stu1);
            session.save(stu2);
            session.save(stu3);
            
            /*再次添加选课*/
            //学生记录
            Student stu = (Student)session.get(Student.class, "2");
            //课程记录
            Course course= (Course)session.get(Course.class, "1");
            stu.getCous().add(course);
            session.update(stu);
            
            /*删除选课*/
            //学生记录
            Student stuDelete = (Student)session.get(Student.class, "2");
            //课程记录
            Course couDelete= (Course)session.get(Course.class, "1");
            stuDelete.getCous().remove(couDelete);
            session.update(stuDelete);
            
            //删除学生记录
            session.delete(stuDelete);
            
            session.getTransaction().commit();
    
        }
    
    }
    View Code
  • 相关阅读:
    写了一个数据库的连继ID号(格式:xxxx000001)
    热心的网友<寒羽枫>帮忙解决水晶报表打印纸张问题
    解决vs2005自带水晶报表次数的限制的次数
    WebWork教程 Interceptor(拦截器)
    由于最近网站内容需要更新的还是满多的,于是想开发一个采集系统。收集了一下资料。
    ASP.NET AJAX 1.0 Beta 2 发布
    水晶报表的显示与打印不一至问题
    去年治疗过敏性鼻炎所用的药。
    正则表达式快速入门教程
    sql复制一条相同的记录最快最好的办法。
  • 原文地址:https://www.cnblogs.com/zxd543/p/6693844.html
Copyright © 2011-2022 走看看