1. 程式人生 > >(6)hibernate中ManyToOne單向

(6)hibernate中ManyToOne單向

many2one:在many一方新增外來鍵,比如classroom和student,就在student這一方新增外來鍵

先新增1:

void test() {
		Session s=null;
		try {
			s=HibernateUtil.getSession();
			s.beginTransaction();
			Classroom cla=new Classroom();
			cla.setGrade(2017);
			cla.setName("計算機");
			s.save(cla);
			
			Student stu1=new Student();
			stu1.setName("test01");
			stu1.setNumber(1);
			stu1.setCla(cla);
			s.save(stu1);
			
			Student stu2=new Student();
			stu2.setName("test02");
			stu2.setNumber(2);
			stu2.setCla(cla);
			s.save(stu2);
			
			s.getTransaction().commit();
		} catch (Exception e) {
			// TODO 自動生成的 catch 塊
			e.printStackTrace();
			s.getTransaction().rollback();
		}finally {
			HibernateUtil.closeSession(s);
		}
	}

發3條sql

先新增多:

void test01() {
		Session s=null;
		try {
			s=HibernateUtil.getSession();
			s.beginTransaction();
			
			Student stu1=new Student();
			stu1.setName("test01");
			stu1.setNumber(1);
			s.save(stu1);
			
			Student stu2=new Student();
			stu2.setName("test02");
			stu2.setNumber(2);
			s.save(stu2);
			
			Classroom cla=new Classroom();
			cla.setGrade(2017);
			cla.setName("計算機");
			s.save(cla);
			
			stu1.setCla(cla);
			stu2.setCla(cla);
			
			s.getTransaction().commit();
		} catch (Exception e) {
			// TODO 自動生成的 catch 塊
			e.printStackTrace();
			s.getTransaction().rollback();
		}finally {
			HibernateUtil.closeSession(s);
		}
	}

發5條sql(3條save  2條update),stu1和stu2在save之後就變為持久化狀態了,之後在commit發現物件與session快取物件不同(stu1和stu2後來設定了classroom),則發2條update進行修改

void test02() {
		Session s=null;
		try {
			s=HibernateUtil.getSession();
			s.beginTransaction();
			
			Student stu=(Student)s.load(Student.class, 13);
			System.out.println(stu.getNumber());
			System.out.println(stu.getName());
			System.out.println(stu.getCla().getName());
			s.getTransaction().commit();
		} catch (Exception e) {
			// TODO 自動生成的 catch 塊
			e.printStackTrace();
			s.getTransaction().rollback();
		}finally {
			HibernateUtil.closeSession(s);
		}
	}

獲取stu的Number以及Name,由於延遲載入,只需要一條sql,獲取cla的name時,就得再發一條sql

void test03() {
		Session s=null;
		try {
			s=HibernateUtil.getSession();
			s.beginTransaction();
			Classroom cla=new Classroom();
			cla.setGrade(2017);
			cla.setName("計算機");
			 
			
			Student stu1=new Student();
			stu1.setName("test01");
			stu1.setNumber(1);
			stu1.setCla(cla);
			s.save(stu1);
			
			Student stu2=new Student();
			stu2.setName("test02");
			stu2.setNumber(2);
			stu2.setCla(cla);
			s.save(stu2);
			
			s.getTransaction().commit();
		} catch (Exception e) {
			// TODO 自動生成的 catch 塊
			e.printStackTrace();
			s.getTransaction().rollback();
		}finally {
			HibernateUtil.closeSession(s);
		}
	}

注意:(1).cla不進行save,資料庫沒有cla的資料,在新增student沒有外來鍵,就會丟擲異常,在many-to-one設定cascade=“all”,如果新增資料庫沒有關聯物件(比如有student卻沒有classroom的資料),則會自動建立classroom,完成關聯

void test04() {
		Session s=null;
		try {
			s=HibernateUtil.getSession();
			s.beginTransaction();
		Student stu1=s.load(Student.class, 1);
		s.delete(stu1);
			s.getTransaction().commit();
		} catch (Exception e) {
			// TODO 自動生成的 catch 塊
			e.printStackTrace();
			s.getTransaction().rollback();
		}finally {
			HibernateUtil.closeSession(s);
		}
	}

注意:(1).刪除stu也會自動刪除關聯物件classroom,但是由於classroom還有stu在關聯,所以會報錯

總結:如果沒有特殊情況不要使用cascade,特殊需求才使用cascade的add,正常的add都需要程式設計師手動完成的,還有一種情況可以使用cascade,在一的一方進行刪除(classroom),則會把關聯的stu全都刪除,但是一般情況還是手動刪除較為合適。