/** * 测试级联添加和加载策略 */public class AddCascadeTest { public static void main(String[] args) {// t1();//1.在Hibernate中实现添加Dept级联添加Emp// t2();//2.在scott账户下级联保存一个姓名为'李四',部门编号为"10"的员工// t3();//3.测试加载策略,默认为延迟加载。在session中查询数据库(session没有关闭)// t4();//4.测试加载策略,默认为延迟加载。在session关闭后查询数据库(session已经关闭) t5();//5.测试加载策略,设为延迟加载。在session关闭后查询数据库(session已经关闭) }1、打开MyEclipse,创建一个新的java项目,命名为Hibernate_Oracle_AddCascade
2、打开oracle数据库连接,并在MyEclipse中的DB Browser新建一个数据库连接,名为scott
3、在java项目中,新建一个lib目录,再选中java项目导入hibernate框架
查看生成的hibernate.cfg.xml文件
4、添加Hibernate框架后,反向生成映射类和映射文件
再次查看生成的hibernate.cfg.xml文件
5、选中Dept.hbm.xml和Dept.java文件,修改属性类型
查看Dept.java文件和Dept.hbm.xml文件
6、在hibernate.cfg.xml添加打印sql语句
7.测试级联添加和加载策略,这是主方法
/** * 测试级联添加和加载策略 */public class AddCascadeTest { public static void main(String[] args) {// t1();//1.在Hibernate中实现添加Dept级联添加Emp// t2();//2.在scott账户下级联保存一个姓名为'李四',部门编号为"10"的员工// t3();//3.测试加载策略,默认为延迟加载。在session中查询数据库(session没有关闭)// t4();//4.测试加载策略,默认为延迟加载。在session关闭后查询数据库(session已经关闭) t5();//5.测试加载策略,设为延迟加载。在session关闭后查询数据库(session已经关闭) }测试方法一:/** * 1.在Hibernate中如何实现添加Dept级联添加Emp?<br/> * 分析<br/> * 建立从Dept到Emp的一对多关联<br/> * 在<set>标签中配置cascade属性为all<br/> * 例:在scott账户下添加一个部门,并同时向部门中添加2个员工<br/> */ PRivate static void t1() { Configuration config = new Configuration().configure(); SessionFactory sessionFactory = config.buildSessionFactory(); Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); //scott账户dept表下添加一个部门 Dept dept = new Dept(); dept.setDname("研发一部"); dept.setLoc("武汉软件新城"); //给新添加的部门添加两个新员工 //1.添加新员工张无忌,部门为研发一部 Emp newEmp1 = new Emp(); newEmp1.setEname("张无忌"); newEmp1.setDept(dept); //2.添加新员工张三丰,部门为研发一部 Emp newEmp2 = new Emp(); newEmp2.setEname("张三丰"); newEmp2.setDept(dept); //在部门表中级联添加员工 dept.getEmps().add(newEmp1); dept.getEmps().add(newEmp2); //持久化保存 session.save(dept); transaction.commit(); session.close(); sessionFactory.close(); }运行结果:
查询数据库,结果如下:
这是因为在Dept.hbm.xml中没有设置级联操作,打开Dept.hbm.xml设置
再次运行,插入部门并级联添加员工成功。
查询数据库,插入成功。
测试方法二:
/** * 2.在scott账户下级联保存一个姓名为'李四光',部门编号为"10"的员工 */ private static void t2() { Configuration config = new Configuration().configure(); SessionFactory sessionFactory = config.buildSessionFactory(); Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); //咋scott账户emp表下添加一个新员工,姓名为'李四光' Emp emp = new Emp(); emp.setEname("李四光"); //通过session获取部门编号为10的部门 Dept dept = (Dept) session.get(Dept.class, 10); //将获得的部门编号添加到新员工 emp.setDept(dept); //持久化保存 session.save(emp); transaction.commit(); session.close(); sessionFactory.close(); }运行结果:
查询数据库:
测试方法三:
/** * 3.测试加载策略<br/> * 默认为延迟加载。<br/> * 如果<class>元素的lazy属性为true。表示采用延迟加载;<br/> * 如果lazy属性为false,表示采用立即加载<br/> * * 此处测试在session没有关闭时,查询数据库采用延迟加载的结果 */ private static void t3() { Configuration config = new Configuration().configure(); SessionFactory sessionFactory = config.buildSessionFactory(); Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); //通过session获取部门编号为10的部门 Dept dept = (Dept) session.get(Dept.class, 10); //打印部门编号为10的部门名称,lazy true/false 类级别 System.out.println(dept.getDname()); /** * 查询数据库(session没有关闭) */ //打印部门编号为10的emp表中的员工 for(Object o : dept.getEmps()){ Emp emp = (Emp) o; System.out.println(emp.getEname()+"/t/t"+emp.getDept().getDeptno()); } transaction.commit(); session.close(); sessionFactory.close(); }运行结果:
测试方法四:
/** * 4.测试加载策略<br/> * 默认为延迟加载。<br/> * 在session关闭后查询数据库(session已经关闭)<br/> * 如果<class>元素的lazy属性为true。表示采用延迟加载;<br/> * 如果lazy属性为false,表示采用立即加载<br/> * * 此处测试在session关闭时,查询数据库采用延迟加载的结果 */ private static void t4() { Configuration config = new Configuration().configure(); SessionFactory sessionFactory = config.buildSessionFactory(); Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); //通过session获取部门编号为10的部门 Dept dept = (Dept) session.get(Dept.class, 10); //打印部门编号为10的部门名称,lazy true/false 类级别 System.out.println(dept.getDname()); transaction.commit(); session.close(); sessionFactory.close(); /** * 查询数据库(session已经关闭) */ //打印部门编号为10的emp表中的员工 for(Object o : dept.getEmps()){ Emp emp = (Emp) o; System.out.println(emp.getEname()+"/t/t"+emp.getDept().getDeptno()); } }运行出错,在session关闭后,不能查询oracle数据库。
异常信息为no session or session was closaed.没有session或session已关闭。
测试方法五:
/** * 5.测试加载策略<br/> * 默认为延迟加载。<br/> * 如果<class>元素的lazy属性为true。表示采用延迟加载;<br/> * 如果lazy属性为false,表示采用立即加载<br/> * * 此处测试在session关闭时,查询数据库采用'立即加载'的结果 */ private static void t5() { Configuration config = new Configuration().configure(); SessionFactory sessionFactory = config.buildSessionFactory(); Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); //通过session获取部门编号为10的部门 Dept dept = (Dept) session.get(Dept.class, 10); //打印部门编号为10的部门名称,lazy true/false 类级别 System.out.println(dept.getDname()); transaction.commit(); session.close(); sessionFactory.close(); /** * 查询数据库(session已经关闭) */ //打印部门编号为10的emp表中的员工 for(Object o : dept.getEmps()){ Emp emp = (Emp) o; System.out.println(emp.getEname()+"/t/t"+emp.getDept().getDeptno()); } }在Dept.hbm.xml中的<set>标签中添加lazy属性,属性值为false,采用立即加载策略。
运行测试方法五,结果如下:
可以看到,程序运行成功。说明立即加载策略在session关闭后依然能访问数据库。
最后在说一个,在“多对一”中lazy属性的值为
<!-- 多对一many-to-one -->lazy属性:no-proxy 无代理延迟加载 proxy延迟加载,默认为 proxy false立即加载-->
新闻热点
疑难解答