zoukankan      html  css  js  c++  java
  • 6、Many-to-one的单向

    1、在1:n的关系中,

         在Class的关系中,应该在n的一方,持有1的一方的引用。

         在Table的关系中,应该是n的一方有外键

    many-to-one (用在n的一方的 hbm.xml的配置文件中)

    关于 many-to-one 的一些测试代码

    1、测试添加顺序的先后关系  ----最佳实践:一定要先添加一的一方,之后在添加多的一方

        1.1先添加1的一方,再添加n的一方

    public void testAdd01() {
            Session session = null;
            try {
                session = HibernateUtil.openSession();
                session.beginTransaction();
                //先添加1
                Classroom c = new Classroom();
                c.setGrade(2012);
                c.setName("计算机网络技术");
                session.save(c);
                
                //在添加n
                Student stu1 = new Student();
                stu1.setName("猪八戒");
                stu1.setNo("001");
                stu1.setClassroom(c);
                session.save(stu1);
                Student stu2 = new Student();
                stu2.setName("孙悟空");
                stu2.setNo("002");
                stu2.setClassroom(c);
                session.save(stu2);
                
                session.getTransaction().commit();
            } catch (Exception e) {
                e.printStackTrace();
                if(session!=null) session.getTransaction().rollback();
            } finally {
                HibernateUtil.close(session);
            }
        }

        1.2 先添加n的一方,再添加1的一方

        

    public void testAdd02() {
            Session session = null;
            try {
                session = HibernateUtil.openSession();
                session.beginTransaction();
                //先添加n
                Student stu1 = new Student();
                stu1.setName("沙僧");
                stu1.setNo("003");
                session.save(stu1);
                Student stu2 = new Student();
                stu2.setName("唐僧");
                stu2.setNo("004");
                session.save(stu2);
                //在添加1
                Classroom c = new Classroom();
                c.setGrade(2012);
                c.setName("计算机应用技术");
                session.save(c);
                
                //此时还会发两条update
                stu1.setClassroom(c);
                stu2.setClassroom(c);
                //最佳实践:一定要先添加一的一方,之后在添加多的一方
                session.getTransaction().commit();
            } catch (Exception e) {
                e.printStackTrace();
                if(session!=null) session.getTransaction().rollback();
            } finally {
                HibernateUtil.close(session);
            }
        }

    2、测试many-to-one中 cascade的用法 -------一般不在多的一方使用cascade,可能使用cascade的地方一般都是一的一方进行删除时使用

        

    public void testAdd03() {
            Session session = null;
            try {
                session = HibernateUtil.openSession();
                session.beginTransaction();
                Classroom c = new Classroom();
                c.setGrade(2012);
                c.setName("计算机信息管理");
                //此时classroom没有存储,所以在添加student的时候没有外键,会抛出异常
                //运用casecade=all可以解决
                Student stu1 = new Student();
                stu1.setName("如来");
                stu1.setNo("005");
                session.save(stu1);
                Student stu2 = new Student();
                stu2.setName("观音");
                stu2.setNo("006");
                session.save(stu2);
                stu1.setClassroom(c);
                stu2.setClassroom(c);
                session.getTransaction().commit();
            } catch (Exception e) {
                e.printStackTrace();
                if(session!=null) session.getTransaction().rollback();
            } finally {
                HibernateUtil.close(session);
            }
        }

    3、关于懒加载问题的测试 -----student的关联对象Classroom也是延迟加载的,会再发一条sql来取对象

        

    public void testLoad() {
            Session session = null;
            try {
                session = HibernateUtil.openSession();
                session.beginTransaction();
                Student stu = (Student)session.load(Student.class, 1);
                //此时仅仅只是发一条sql
                System.out.println(stu.getName());
                //此时student的关联对象Classroom也是延迟加载的,会再发一条sql来取对象
                System.out.println(stu.getClassroom().getName());
                session.getTransaction().commit();
            } catch (Exception e) {
                e.printStackTrace();
                if(session!=null) session.getTransaction().rollback();
            } finally {
                HibernateUtil.close(session);
            }
        }
  • 相关阅读:
    如何把项目中经常使用的信息放在全局的对象里,随取随用?
    优秀代码
    gcc编译C代码后,输出乱码
    mybatis !=null的一个坑
    String转int[]
    插值算法的公式 mid=low+(key-a[low])/(a[high]-a[low])*(high-low) 是怎么来的
    关于Leetcode的交替打印FooBar,我的答案一直超时
    git找回前几个版本删除的某个文件
    Google 此手机号无法用于验证 解决方法
    Postgresql 一对多如何将原本用,隔开的id替换为name
  • 原文地址:https://www.cnblogs.com/zhangbaowei/p/4867624.html
Copyright © 2011-2022 走看看