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); } }