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 (?, ?)




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值