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);
        }
    }
原文地址:https://www.cnblogs.com/zhangbaowei/p/4867624.html