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