zoukankan      html  css  js  c++  java
  • hibernate建表一对多 一的一方控制多的方

    级联操作,操作class对象的时候 级联操作 student

    Classes.java文件

     1 package cn.itcast.hiberate.sh.domain;
     2 
     3 import java.util.Set;
     4 
     5 public class Classes {
     6     private Long cid;
     7     private String cname;
     8     private String description;
     9     public String getDescription() {
    10         return description;
    11     }
    12     public Classes(String cname, String description) {
    13         super();
    14         this.cname = cname;
    15         this.description = description;
    16     }
    17     public Classes(Long cid, String cname, String description,
    18             Set<Student> students) {
    19         super();
    20         this.cid = cid;
    21         this.cname = cname;
    22         this.description = description;
    23         this.students = students;
    24     }
    25     public Classes() {
    26         // TODO Auto-generated constructor stub
    27     }
    28     public void setDescription(String description) {
    29         this.description = description;
    30     }
    31     private Set<Student> students;
    32     public Long getCid() {
    33         return cid;
    34     }
    35     public void setCid(Long cid) {
    36         this.cid = cid;
    37     }
    38     public String getCname() {
    39         return cname;
    40     }
    41     public void setCname(String cname) {
    42         this.cname = cname;
    43     }
    44     public Set<Student> getStudents() {
    45         return students;
    46     }
    47     public void setStudents(Set<Student> students) {
    48         this.students = students;
    49     }
    50     
    51 }

    Classes.hbm.xml

    建立一对多的关系

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
     3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
     4 <hibernate-mapping>
     5     <class name="cn.itcast.hiberate.sh.domain.Classes">
     6         <id name="cid" length="5" type="java.lang.Long">
     7             <generator class="increment"></generator>
     8         </id>
     9         <property name="cname" length="20" type="java.lang.String"></property>
    10         
    11         <property name="description" length="100" type="java.lang.String"></property>
    12         <!-- 
    13             set元素对应类中的set集合
    14             通过set元素使classes表与student表建立关联
    15                key是通过外键的形式让两张表建立关联
    16                one-to-many是通过类的形式让两个类建立关联
    17             
    18             cascade 级联
    19                save-update
    20                    1、当 保存班级的时候,对学生进行怎么样的操作
    21                         如果学生对象在数据库中没有对应的值,这个时候会执行save操作
    22                         如果学生对象在数据库中有对应的值,这个时候会执行update操作
    23                delete
    24                all
    25             inverse  维护关系
    26                true      不维护关系     
    27                false     维护关系
    28                default   false
    29          -->
    30         <set name="students" cascade="save-update" inverse="true">
    31             <!-- 
    32                 key是用来描述外键
    33              -->
    34             <key>
    35                 <column name="cid"></column>
    36             </key>
    37             <one-to-many class="cn.itcast.hiberate.sh.domain.Student"/>
    38         </set>
    39     </class>
    40 </hibernate-mapping>

    Student.java

     1 package cn.itcast.hiberate.sh.domain;
     2 
     3 public class Student {
     4     private Long sid;
     5     private String sname;
     6     private String description;
     7     public Long getSid() {
     8         return sid;
     9     }
    10     public void setSid(Long sid) {
    11         this.sid = sid;
    12     }
    13     public Student(String sname, String description) {
    14         super();
    15         this.sname = sname;
    16         this.description = description;
    17     }
    18     public Student() {
    19         // TODO Auto-generated constructor stub
    20     }
    21     public String getSname() {
    22         return sname;
    23     }
    24     public void setSname(String sname) {
    25         this.sname = sname;
    26     }
    27     public String getDescription() {
    28         return description;
    29     }
    30     public void setDescription(String description) {
    31         this.description = description;
    32     }
    33     
    34 }

    Test.java

      1 package cn.itcast.hibernate.sh.test;
      2 
      3 import java.util.ArrayList;
      4 import java.util.HashSet;
      5 import java.util.List;
      6 import java.util.Set;
      7 
      8 import org.hibernate.Session;
      9 import org.hibernate.Transaction;
     10 import org.hibernate.annotations.Type;
     11 import org.junit.Test;
     12 
     13 import cn.itcast.hiberate.sh.domain.Classes;
     14 import cn.itcast.hiberate.sh.domain.Student;
     15 import cn.itcast.hibernate.sh.utils.HiberanteUtils;
     16 
     17 /**
     18  * 1、新建一个班级
     19  * 2、新建一个学生
     20  * 3、新建一个班级的时候同时新建一个学生
     21  * 4、已经存在一个班级,新建一个学生,建立学生与班级之间的关系
     22  * 5、已经存在一个学生,新建一个班级,把学生加入到该班级
     23  * 6、把一个学生从一个班级转移到另一个班级
     24  * 7、解析一个班级和一个学生之间的关系
     25  * 8、解除一个班级和一些学生之间的关系
     26  * 9、解除该班级和所有的学生之间的关系
     27  * 10、已经存在一个班级,已经存在一个学生,建立该班级与该学生之间的关系
     28  * 11、已经存在一个班级,已经存在多个学生,建立多个学生与班级之间的关系
     29  * 12、删除学生
     30  * 13、删除班级
     31  *     删除班级的时候同时删除学生
     32  *     在删除班级之前,解除班级和学生之间的关系
     33  * @author Think
     34  *
     35  */
     36 public class OneToManySingleTest extends HiberanteUtils{
     37     @Test
     38     public void testSaveClasses(){
     39         Session session = sessionFactory.openSession();
     40         Transaction transaction = session.beginTransaction();
     41         Classes classes = new Classes();
     42         classes.setCname("传智上海云一期");
     43         classes.setDescription("很牛");
     44         session.save(classes);
     45         transaction.commit();
     46         session.close();
     47     }
     48     
     49     
     50     
     51     @Test
     52     public void testSaveStudent(){
     53         Session session = sessionFactory.openSession();
     54         Transaction transaction = session.beginTransaction();
     55         Student student = new Student();
     56         student.setSname("班长");
     57         student.setDescription("老牛:很牛");
     58         session.save(student);
     59         transaction.commit();
     60         session.close();
     61     }
     62     
     63     @Test
     64     public void testSaveClasses_Student(){
     65         Session session = sessionFactory.openSession();
     66         Transaction transaction = session.beginTransaction();
     67         
     68         Classes classes = new Classes();
     69         classes.setCname("传智上海云二期:");
     70         classes.setDescription("很牛X");
     71         
     72         Student student = new Student();
     73         student.setSname("班长");
     74         student.setDescription("老牛:很牛X");
     75         
     76         session.save(student);
     77         session.save(classes);
     78         transaction.commit();
     79         session.close();
     80     }
     81     
     82     /**
     83      * 在保存班级的时候,级联保存学生
     84      */
     85     @Test
     86     public void testSaveClasses_Cascade_Student_Save(){
     87         Session session = sessionFactory.openSession();
     88         Transaction transaction = session.beginTransaction();
     89         
     90         Classes classes = new Classes();
     91         classes.setCname("传智上海云三期:");
     92         classes.setDescription("很牛XX");
     93         
     94         Student student = new Student();
     95         student.setSname("班长");
     96         student.setDescription("老牛:很牛XX");
     97         
     98         Set<Student> students = new HashSet<Student>();
     99         students.add(student);
    100         
    101         //建立classes与student之间的关联
    102         classes.setStudents(students);
    103         session.save(classes);
    104         transaction.commit();
    105         session.close();
    106     }
    107     
    108     @Test
    109     public void testSaveClasses_Cascade_Student_Update(){
    110         Session session = sessionFactory.openSession();
    111         Transaction transaction = session.beginTransaction();
    112         
    113         Classes classes = new Classes();
    114         classes.setCname("传智上海云四期:");
    115         classes.setDescription("很牛XXX");
    116         
    117         Student student = (Student)session.get(Student.class, 1L);
    118         
    119         student.setSname("班秘");
    120         
    121         Set<Student> students = new HashSet<Student>();
    122         students.add(student);
    123         
    124         classes.setStudents(students);
    125     
    126         session.save(classes);
    127         transaction.commit();
    128         session.close();
    129     }
    130     
    131     @Test
    132     public void testUpdateClasses_Cascade_Student_Save(){
    133         Session session = sessionFactory.openSession();
    134         Transaction transaction = session.beginTransaction();
    135         Classes classes = (Classes)session.get(Classes.class, 5L);
    136         Student student = new Student();
    137         student.setSname("班花");
    138         student.setDescription("稀有人物");
    139         classes.getStudents().add(student);
    140         transaction.commit();
    141         session.close();
    142     }
    143     
    144     @Test
    145     public void testUpdateClasses_Cascade_Student_Update(){
    146         Session session = sessionFactory.openSession();
    147         Transaction transaction = session.beginTransaction();
    148         Classes classes = (Classes)session.get(Classes.class, 5L);
    149         Set<Student> students = classes.getStudents();//为cid为5的班级的所有的学生
    150 //        for(Student student:students){
    151 //            student.setDescription("压力山大");
    152 //        }
    153         transaction.commit();
    154         session.close();
    155     }
    156     
    157     /**
    158      * 一个错误的演示
    159      */
    160     @Test
    161     public void testSaveClasses_Cascade_Student_Save_Error(){
    162         Session session = sessionFactory.openSession();
    163         Transaction transaction = session.beginTransaction();
    164         
    165         Classes classes = new Classes();
    166         classes.setCname("传智上海云六期:");
    167         classes.setDescription("很牛XXXXXX");
    168         
    169         Student student = new Student();
    170         student.setSname("班长XXXXXX");
    171         student.setDescription("老牛:很牛XXXXXX");
    172         
    173         Set<Student> students = new HashSet<Student>();
    174         students.add(student);
    175         
    176         //建立classes与student之间的关联
    177         classes.setStudents(students);
    178         session.save(classes);
    179         transaction.commit();
    180         session.close();
    181     }
    182     
    183     
    184     /**
    185      * 已经存在一个班级,新建一个学生,建立学生与班级之间的关系
    186      *    通过更新班级级联保存学生  cascade
    187      *    建立班级和学生之间的关系  inverse
    188      */
    189     @Test
    190     public void testSaveStudent_R_1(){
    191         Session session = sessionFactory.openSession();
    192         Transaction transaction = session.beginTransaction();
    193         Student student = new Student();
    194         student.setSname("技术班长");
    195         student.setDescription("大神");
    196         Classes classes = (Classes)session.get(Classes.class, 1L);
    197         
    198         classes.getStudents().add(student);
    199         
    200         transaction.commit();
    201         session.close();
    202     }
    203     
    204     /**
    205      *     Hibernate: select classes0_.cid as cid0_0_, classes0_.cname as cname0_0_, classes0_.description as descript3_0_0_ from Classes classes0_ where classes0_.cid=?
    206         Hibernate: select max(sid) from Student
    207         Hibernate: select students0_.cid as cid0_1_, students0_.sid as sid1_, students0_.sid as sid1_0_, students0_.sname as sname1_0_, students0_.description as descript3_1_0_ from Student students0_ where students0_.cid=?
    208         Hibernate: insert into Student (sname, description, sid) values (?, ?, ?)
    209         更新关系的操作
    210         Hibernate: update Student set cid=? where sid=?
    211      */
    212     @Test
    213     public void testSaveStudent_R_2(){
    214         Session session = sessionFactory.openSession();
    215         Transaction transaction = session.beginTransaction();
    216         Student student = new Student();
    217         student.setSname("技术班长");
    218         student.setDescription("大神");
    219         Classes classes = (Classes)session.get(Classes.class, 1L);
    220         
    221         session.save(student);
    222         
    223         classes.getStudents().add(student);
    224         
    225         transaction.commit();
    226         session.close();
    227     }
    228     
    229     /**
    230      * 已经存在一个学生,新建一个班级,把学生加入到该班级
    231      */
    232     @Test
    233     public void testSaveClasses_R(){
    234         Session session = sessionFactory.openSession();
    235         Transaction transaction = session.beginTransaction();
    236         
    237         Classes classes = new Classes();
    238         classes.setCname("老毕基础加强班");
    239         classes.setDescription("必看,杀手锏");
    240         
    241         Student student = (Student)session.get(Student.class, 2L);
    242         Set<Student> students = new HashSet<Student>();
    243         students.add(student);
    244         classes.setStudents(students);
    245         
    246         session.save(classes);
    247         transaction.commit();
    248         session.close();
    249     }
    250     
    251     /**
    252      * 把一个学生从一个班级转移到另一个班级
    253      *     Hibernate: select classes0_.cid as cid0_0_, classes0_.cname as cname0_0_, classes0_.description as descript3_0_0_ from Classes classes0_ where classes0_.cid=?
    254         Hibernate: select classes0_.cid as cid0_0_, classes0_.cname as cname0_0_, classes0_.description as descript3_0_0_ from Classes classes0_ where classes0_.cid=?
    255         Hibernate: select student0_.sid as sid1_0_, student0_.sname as sname1_0_, student0_.description as descript3_1_0_ from Student student0_ where student0_.sid=?
    256         Hibernate: select students0_.cid as cid0_1_, students0_.sid as sid1_, students0_.sid as sid1_0_, students0_.sname as sname1_0_, students0_.description as descript3_1_0_ from Student students0_ where students0_.cid=?
    257         Hibernate: select students0_.cid as cid0_1_, students0_.sid as sid1_, students0_.sid as sid1_0_, students0_.sname as sname1_0_, students0_.description as descript3_1_0_ from Student students0_ where students0_.cid=?
    258         Hibernate: update Student set cid=null where cid=? and sid=?
    259         Hibernate: update Student set cid=? where sid=?
    260      */
    261     @Test
    262     public void testTransformClass(){
    263         Session session = sessionFactory.openSession();
    264         Transaction transaction = session.beginTransaction();
    265         //Classes classes5 = (Classes)session.get(Classes.class, 5L);
    266         Classes classes6 = (Classes)session.get(Classes.class, 6L);
    267         Student student = (Student)session.get(Student.class, 1L);
    268         //classes5.getStudents().remove(student);
    269         classes6.getStudents().add(student);
    270         transaction.commit();
    271         session.close();
    272     }
    273     
    274     /**
    275      * 解除一个班级和一些学生之间的关系
    276      */
    277     
    278     @Test
    279     public void testR_Some(){
    280         Session session = sessionFactory.openSession();
    281         Transaction transaction = session.beginTransaction();
    282         Classes classes = (Classes)session.get(Classes.class, 1L);
    283         Set<Student> students = classes.getStudents();
    284 //        for(Student student:students){
    285 //            if(student.getSid().longValue()==6||student.getSid().longValue()==7){
    286 //                students.remove(student);
    287 //            }
    288 //        }
    289         //set-->list
    290         List<Student> sList = new ArrayList<Student>(students);
    291         for(int i=0;i<sList.size();i++){
    292             if(sList.get(i).getSid().longValue()==6||sList.get(i).getSid().longValue()==7){
    293                 sList.remove(sList.get(i));
    294                 i--;
    295             }
    296         }
    297         
    298         students = new HashSet<Student>(sList);
    299         classes.setStudents(students);
    300         /**
    301          * 增强for循环只能修改一次
    302          *   1、用普通的for循环
    303          *   2、新建一个set集合,把原来的set集合要保留的数据存放到新的set集合中
    304          */
    305         transaction.commit();
    306         session.close();
    307     }
    308     
    309     /*
    310      * classes.setStudents(null);直接把班级针对student的集合设置为null
    311      */
    312     @Test
    313     public void testRealseAll(){
    314         Session session = sessionFactory.openSession();
    315         Transaction transaction = session.beginTransaction();
    316         Classes classes = (Classes)session.get(Classes.class, 1L);
    317 //        Set<Student> students = classes.getStudents();
    318 //        students.clear();
    319         classes.setStudents(null);
    320         transaction.commit();
    321         session.close();
    322     }
    323     
    324     /**
    325      * 已经存在一个班级,已经存在一个学生,建立该班级与该学生之间的关系
    326      * 11、已经存在一个班级,已经存在多个学生,建立多个学生与班级之间的关系
    327      */
    328     
    329     @Test
    330     public void testDeleteStudent(){
    331         Session session = sessionFactory.openSession();
    332         Transaction transaction = session.beginTransaction();
    333         Student student = (Student)session.get(Student.class, 8L);
    334         session.delete(student);
    335         transaction.commit();
    336         session.close();
    337     }
    338     
    339     
    340     //这个时候必须保证inverse="false"才能保证能够维持 Classes和Student之间的关系, 如果为inverse="true"并且cascade="save-update"会报错,外键         //约束错误
    341     @Test
    342     public void testDeleteClasses(){
    343         Session session = sessionFactory.openSession();
    344         Transaction transaction = session.beginTransaction();
    345         Classes classes = (Classes)session.get(Classes.class, 5L);
    346         //classes.setStudents(null);        //因为inverse="true"所以,这句话对数据库没作用,没有关联关系了
    347         session.delete(classes);
    348         transaction.commit();
    349         session.close();
    350     }
    351     
        //这个时候用到了 Classes.hbm.xml中的级联属性 cascade="delete"(用all就包括它们两个属性)inverse="true"也是没有关系的
    352 @Test
    353 public void testDeleteClasses_Cascade(){
    354 Session session = sessionFactory.openSession();
    355         Transaction transaction = session.beginTransaction(); 
    356 Classes classes = (Classes)session.get(Classes.class, 5L);
    357 session.delete(classes);
    358 transaction.commit();
    359 session.close();
    360 }
    361

    362 }

  • 相关阅读:
    php中除法取整的方法(round,ceil,floor)
    ajax 实现修改功能
    ueditor PHP版本使用方法
    $.ajax json 在本地正常 上传服务器不正常
    Web常见几种攻击与预防方式
    PHP使用Session遇到的一个Permission denied Notice解决办法
    VUE引入模块之import xxx from 'xxx' 和 import {xxx} from 'xxx'的区别
    JS事件委托或者事件代理原理以及实现
    JS 一次性事件问题
    原生JS 和 JQ 获取滚动条的高度,以及距离顶部的高度
  • 原文地址:https://www.cnblogs.com/friends-wf/p/3774909.html
Copyright © 2011-2022 走看看