zoukankan      html  css  js  c++  java
  • 10hibernate_one2many_1

    hihernate一对多关联映射(单向Classes----->Student)

    一对多关联映射利用了多对一关联映射原理

    多对一关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是多指向一
    一对多关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是一指向多

    也就是说一对多和多对一的映射策略是一样的,只是站的角度不同

    在一一端维护关系的缺点:
        * 如果将t_student表里的classesid字段设置为非空,则无法保存
        * 因为不是在student这一端维护关系,所以student不知道是哪个班的,
          所以需要发出多余的update语句来更新关系


     一方:Classes.java

    package com.bjsxt.hibernate;

    import java.util.Set;

    public class Classes {
        
        private int id;
        
        private String name;
        
        private Set students; 
        
        <hibernate-mapping package="com.bjsxt.hibernate">
        <class name="Classes" table="t_classes">
            <id name="id">
                <generator class="native"/>
            </id>
            <property name="name"/>
            <set name="students">
                <key column="classesid"/>
                <one-to-many class="Student"/>
            </set>
        </class>
    </hibernate-mapping>

    -------------------------------------------------------------------------------
           多方:
        public class Student {
        
        private int id;
        
        private String name;
        
        <hibernate-mapping>
        <class name="com.bjsxt.hibernate.Student" table="t_student">
            <id name="id">
                <generator class="native"/>
            </id>
            <property name="name"/>
        </class>
    </hibernate-mapping>
    -------------------------------------------------------------------------------
    ExportDB:

    create table t_classes (id integer not null auto_increment, name varchar(255), primary key (id))

    create table t_student (id integer not null auto_increment, name varchar(255), classesid integer, primary key (id))

    alter table t_student add index FK4B9075708EBC77F7 (classesid), add constraint FK4B9075708EBC77F7 foreign key (classesid) references t_classes (id)     

    public void testSave1() {
            Session session = null;
            try {
                session = HibernateUtils.getSession();
                session.beginTransaction();
                
                Student student1 = new Student();
                student1.setName("10");
                session.save(student1);
                
                Student student2 = new Student();
                student2.setName("祖儿");
                session.save(student2);
                
                Set students = new HashSet();
                students.add(student1);
                students.add(student2);
                
                Classes classes = new Classes();
                classes.setName("尚学堂");
                classes.setStudents(students);
                
                //可以正确保存
                session.save(classes);
                
                session.getTransaction().commit();
            }catch(Exception e) {
                e.printStackTrace();
                session.getTransaction().rollback();
            }finally {
                HibernateUtils.closeSession(session);
            }
        }    
    测试结果:
    Hibernate: insert into t_student (name) values (?)
    Hibernate: insert into t_student (name) values (?)
    Hibernate: insert into t_classes (name) values (?)
    Hibernate: update t_student set classesid=? where id=?
    Hibernate: update t_student set classesid=? where id=?    
    -------------------------------------------------------------------------------
    public void testLoad1() {
            Session session = null;
            try {
                session = HibernateUtils.getSession();
                session.beginTransaction();
                
                Classes classes = (Classes)session.load(Classes.class1);
                System.out.println("classes.name=" + classes.getName());
                Set students = classes.getStudents();
                for (Iterator iter=students.iterator(); iter.hasNext();) {
                    Student student = (Student)iter.next();
                    System.out.println("student.name=" + student.getName());
                }
                session.getTransaction().commit();
            }catch(Exception e) {
                e.printStackTrace();
                session.getTransaction().rollback();
            }finally {
                HibernateUtils.closeSession(session);
            }
        }        
    }

    测试结果:
    Hibernate: select classes0_.id as id0_0_, classes0_.name as name0_0_ from t_classes classes0_ where classes0_.id=?
    classes.name=尚学堂
    Hibernate: select students0_.classesid as classesid1_, students0_.id as id1_, students0_.id as id1_0_, students0_.name as name1_0_ from t_student students0_ where students0_.classesid=?
    student.name=祖儿
    student.name=10


    mysql> desc t_classes;
    +-------+--------------+------+-----+---------+----------------+
    | Field | Type         | Null | Key | Default | Extra          |
    +-------+--------------+------+-----+---------+----------------+
    | id    | int(11)      | NO   | PRI | NULL    | auto_increment |
    | name  | varchar(255) | YES  |     | NULL    |                |
    +-------+--------------+------+-----+---------+----------------+
    2 rows in set (0.08 sec)

    mysql> desc t_student;
    +-----------+--------------+------+-----+---------+----------------+
    | Field     | Type         | Null | Key | Default | Extra          |
    +-----------+--------------+------+-----+---------+----------------+
    | id        | int(11)      | NO   | PRI | NULL    | auto_increment |
    | name      | varchar(255) | YES  |     | NULL    |                |
    | classesid | int(11)      | YES  | MUL | NULL    |                |
    +-----------+--------------+------+-----+---------+----------------+
    3 rows in set (0.02 sec)

     
  • 相关阅读:
    ue4 socket
    ue4动画蓝图
    localStorage 用法
    关于textarea中换行、回车、空格的识别与处理
    git忽略某些文件提交
    动态加载js文件
    H5 App页面 绝对定位 软键盘弹出时顶起底部按钮
    Android软键盘弹出时把布局顶上去的解决方法
    javascript 事件委托 和jQuery事件绑定on、off 和one
    escape()、encodeURI()、encodeURIComponent()区别详解
  • 原文地址:https://www.cnblogs.com/alamps/p/2622918.html
Copyright © 2011-2022 走看看