hibernate与oracle级联添加和加载策略

/**
 * 测试级联添加和加载策略
 */
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 立即加载 -->




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值