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