Hibernate 一对多双向操作


public class OneToMoreDoubleTest extends HibernateUtil {

/**
 * 在保存学生的时候,级联保存班级*/
    @Test
    public  void  testSaveStudent_Cascade_SaveClasser(){
        Session session=sessionFactory.getCurrentSession();
        Transaction transaction =session.beginTransaction();

        Student student=new Student();
        student.setName("永超");
        Classes classes=new Classes();
        classes.setName("苹果");
        //建立学生与班级之间的关系
        student.setClasses(classes);
         session.save(student);
        transaction.commit();
    }

    /**
     * 在更新学生的时候,保存班级
     *
     * Hibernate:
     select
                 student0_.sid as sid1_1_0_,
                 student0_.name as name2_1_0_,
                 student0_.description as descript3_1_0_,
                 student0_.cid as cid4_1_0_
     from
                    Student student0_
     where
                    student0_.sid=?
     Hibernate:
            insert
                into
                    C lasses(name, description)
                values(?, ?)
     Hibernate:
                update
                        Student
                set
                     name=?,
                     description=?,
                     cid=?
                 where
                     sid=?
     * 多对多当中,多的一方在save-update的时候,在操作本身的时候,就对级联对象,进行
     * 了操作,一对多则不一样
     * */
    @Test

    //在更新学生的时候,保存班级
    public  void testUpdateStudent_Cascade_SaveClasses(){
        Session session =sessionFactory.getCurrentSession();
        Transaction transaction =session.beginTransaction();
        Student student=(Student) session.get(Student.class,3L);
        Classes classes=new Classes();
        classes.setName("apple12");
        //建立学生与班级之间的关系
        student.setClasses(classes);
        session.update(student);
        transaction.commit();
    }

    /**
     * 已经存在一个班级,已经存在一个学生,让该学生就爱如到该班级
     * 把sid 3的学生加入到cid 为5的班级
     * 把sid 3的学生从cid 为4的班级转到cid 为5的语句也一样
     * */
    @Test
    public void testBuildR(){
        Session session=sessionFactory.getCurrentSession();
        Transaction transaction=session.beginTransaction();

        Student student=(Student)session.get(Student.class,3L);
        Classes classes=(Classes)session.get(Classes.class,5L);
        //建立学生和班级之间的关系
        student.setClasses(classes);
        transaction.commit();
//        transaction.commit();   执行了session.flush提交缓存内的变更对象
    }
     /**
      *解除一个班级和所有学生之间的关系
      * */
    @Test
    public void testRealseAllR(){
        Session session=sessionFactory.getCurrentSession();
        Transaction transaction=session.beginTransaction();
        //提取cid 为3的班级
        Classes classes=(Classes)session.get(Classes.class,5L);
        Set<Student> students=classes.getStudents();
        for (Student student:students){
            student.setClasses(null);
        }
        transaction.commit();
    }

}
总结
    1、一般情况下,一对多,多的一方维护关系,效率比较高
   2、一对多,如果一的一方维护关系,实际上就是发出更新外键的update语句
   3、如果多的一方维护关系,实际上就是更新了student表的所有的字段
   4、一般情况下,Classes.hbm.xml文件中,针对set集合的invserse的值为true
         不维护关系
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值