Hibernate中cascade與inverse屬性的理解

cascade:級聯 (用於簡化session.save());

inverse:true放棄控制權 默認false(你操作的是哪一方,就讓另一方的inverse爲true);

如果想同時實現增刪改查,則不能指定 inverse屬性

一.學生mapper

<hibernate-mapping>
    <class name="com.web.entity.Student" table="STUDENT" schema="SCOTT">
        <id name="sid" type="java.lang.Integer">
            <column name="SID" precision="6" scale="0" />
            <generator class="native" />
        </id>
        <property name="sname" type="java.lang.String">
            <column name="SNAME" length="510" />
        </property>
        <set name="courses" table="COURSE_STUDENT" schema="SCOTT">
            <key>
                <column name="STUDENTSET_SID" precision="10" scale="0" not-null="true" />
            </key>
            <many-to-many entity-name="com.web.entity.Course">
                <column name="COURSE_CID" precision="10" scale="0" not-null="true" />
            </many-to-many>
        </set>
       
    </class>
</hibernate-mapping>


</pre><p></p><pre>
二.課程mapper

<hibernate-mapping>
    <class name="com.web.entity.Course" table="COURSE" schema="SCOTT">
        <id name="cid" type="java.lang.Long">
            <column name="CID" precision="10" scale="0" />
            <generator class="native" />
        </id>
        <property name="cname" type="java.lang.String">
            <column name="CNAME" length="510" />
        </property>
        
        <set name="students" table="COURSE_STUDENT" schema="SCOTT"   cascade="all">
            <key>
                <column name="COURSE_CID" precision="10" scale="0" not-null="true" />
            </key>
            <many-to-many entity-name="com.web.entity.Student">
                <column name="STUDENTSET_SID" precision="10" scale="0" not-null="true" />
            </many-to-many>
        </set>
 
    </class>
</hibernate-mapping>


三.測試

<pre name="code" class="java">//多對多關係映射(增加學生)


private void manyTomany() {
		Session session=HibernateSessionFactory.getSession();
		Transaction tx=null;
		try {
			tx=session.beginTransaction();
			
			Student st=new Student();//被控方
			Student st3=new Student();
			Student st2=new Student();
			st.setSname("未明");
			st2.setSname("石海川");
			st3.setSname("崔啓航");
			//此時不會添加.當遇到session.save(cur);時纔會添加
			
			Course cur=new Course();//操控方
			Course cur2=new Course();
			cur.setCname("java");
			cur.getStudentSet().add(st3);
			cur.getStudentSet().add(st2);
			cur.getStudentSet().add(st);
			
			
			cur2.setCname("Oracle");
			cur2.getStudentSet().add(st3);
			cur2.getStudentSet().add(st2);
			
			session.save(cur);//因爲Mapping中有cascade="all" 所以不會有  違反外鍵約數
			session.save(cur2);
			
			
			tx.commit();
		} catch (Exception e) {
			if(null!=tx)tx.rollback();
			e.printStackTrace();
		}finally{
			session.close();
		}

	}
<pre name="code" class="java">//多對多關係映射(刪除學生)
	private void manyTomanyDelete() {
		Session session=HibernateSessionFactory.getSession();
		Transaction tx=null;
		try {
			tx=session.beginTransaction();
			Student stu=(Student) session.get(Student.class, 240);
			//(此時course爲控制方,如果不加cascade屬性則違反外鍵約數.加上cascade則出現-)
			//在刪除學生時  出現了刪除了所有課程和所有中間表數據(解決方案:將student也設置爲控制方且不能有cascade屬性)
			//結論:只有主控方可以增.刪除,改.查
			session.delete(stu);
			//Course cou=new Course();
			//cou.setCid(119);
			//session.delete(cou);
			tx.commit();
		} catch (Exception e) {
			if(null!=tx)tx.rollback();
			e.printStackTrace();
		}finally{
			session.close();
		}

	}
	
	//多對多關係映射(修改學生)
	private void manyTomanyUpdate() {
		Session session=HibernateSessionFactory.getSession();
		Transaction tx=null;
		try {
			tx=session.beginTransaction();
			Student stu=(Student) session.get(Student.class, 240);
			stu.setSname("新未明");
			session.update(stu);
			//Course cou=new Course();
			//cou.setCid(119);
			//session.delete(cou);
			tx.commit();
		} catch (Exception e) {
			if(null!=tx)tx.rollback();
			e.printStackTrace();
		}finally{
			session.close();
		}

	}




結果:注意sql執行順序

Hibernate: select hibernate_sequence.nextval from dual
Hibernate: select hibernate_sequence.nextval from dual
Hibernate: select hibernate_sequence.nextval from dual
Hibernate: select hibernate_sequence.nextval from dual
Hibernate: select hibernate_sequence.nextval from dual
Hibernate: insert into SCOTT.COURSE (CNAME, CID) values (?, ?)
Hibernate: insert into SCOTT.STUDENT (SNAME, SID) values (?, ?)
Hibernate: insert into SCOTT.STUDENT (SNAME, SID) values (?, ?)
Hibernate: insert into SCOTT.STUDENT (SNAME, SID) values (?, ?)
Hibernate: insert into SCOTT.COURSE (CNAME, CID) values (?, ?)
Hibernate: insert into R_COURSE_STU (COUR_ID, STU_ID) values (?, ?)
Hibernate: insert into R_COURSE_STU (COUR_ID, STU_ID) values (?, ?)
Hibernate: insert into R_COURSE_STU (COUR_ID, STU_ID) values (?, ?)
Hibernate: insert into R_COURSE_STU (COUR_ID, STU_ID) values (?, ?)
Hibernate: insert into R_COURSE_STU (COUR_ID, STU_ID) values (?, ?)




發佈了25 篇原創文章 · 獲贊 9 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章