【SSH三大架構】Hibernate基礎第九篇:cascade關聯關係的級聯操作

來源:互聯網
上載者:User

標籤:cascade   級聯   

這裡要說的是Hibernate的關聯關係的級聯操作,使用cascade屬性控制。


依然用部門和員工舉例,多個員工對應一個部門(多對一關聯關係)

員工類:Employee.java

package cn.itcast.hibernate.domain;public class Employee {      private int id;      private String name;      private Department depart;            public int getId() {          return id;      }      public void setId(int id) {          this.id = id;      }      public String getName() {          return name;      }      public void setName(String name) {          this.name = name;      }      public Department getDepart() {          return depart;      }      public void setDepart(Department depart) {          this.depart = depart;      }  }  
員工類對應檔:Employee.hbm.xml

<?xml version="1.0"?>  <!DOCTYPE hibernate-mapping PUBLIC       "-//Hibernate/Hibernate Mapping DTD 3.0//EN"      "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  <hibernate-mapping       package="cn.itcast.hibernate.domain">      <class name="Employee" table="tb_Employee">          <id name="id">              <generator class="native"/>           </id>          <property name="name" />          <many-to-one name="depart" column="depart_id" />      </class>        </hibernate-mapping>  
部門類:Department.java

package cn.itcast.hibernate.domain;import java.util.Set;public class Department {      private int id;      private String name;      private Set<Employee> emps;        public Set<Employee> getEmps() {return emps;}public void setEmps(Set<Employee> emps) {this.emps = emps;}public int getId() {          return id;      }      public void setId(int id) {          this.id = id;      }      public String getName() {          return name;      }      public void setName(String name) {          this.name = name;      }  }  
部門對應檔:Department.hbm.xml

<?xml version="1.0"?>  <!DOCTYPE hibernate-mapping PUBLIC       "-//Hibernate/Hibernate Mapping DTD 3.0//EN"      "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  <hibernate-mapping       package="cn.itcast.hibernate.domain">        <class name="Department" table="tb_Department">          <id name="id">              <generator class="native"/>           </id>          <property name="name" />                  <set name="emps" cascade="save-update">        <key column="depart_id" />        <one-to-many class="Employee" />        </set>    </class>        </hibernate-mapping>  
可以看到,在上邊的set標籤中,我們定義了cascade="save-update"屬性,當session通過save(),update(),saveOrUpdate()方法來儲存或更新對象時,級聯儲存所有關聯的建立的臨時對象,並且串聯更新所有關聯的游離對象

我們來寫一個測試類別:Many2One.java

package cn.itcast.hibernate;import java.util.HashSet;import java.util.Set;import org.hibernate.Hibernate;import org.hibernate.Session;import org.hibernate.Transaction;import cn.itcast.hibernate.domain.Department;import cn.itcast.hibernate.domain.Employee;public class Many2One {      public static void main(String[] arg){          Department depart = add();            delete(1);    }            static Department add(){          Session s = null;          Transaction tx = null;          try{              Department depart = new Department();                 depart.setName("depart name");                            Employee emp1 = new Employee();              emp1.setDepart(depart); //建立兩個對象的關聯關係              emp1.setName("emp name");                                      Employee emp2 = new Employee();              emp2.setDepart(depart); //建立兩個對象的關聯關係              emp2.setName("emp name");                              Set<Employee> emps = new HashSet<Employee>();            //把兩個Employee對象添加到set集合中            emps.add(emp1);            emps.add(emp2);            //為Department對象注入set集合屬性            depart.setEmps(emps);                        s = HibernateUtil.getSession();              tx = s.beginTransaction();                         //儲存Department對象            s.save(depart);                         tx.commit();              return depart;          }finally{              if(s!=null){                  s.close();              }          }      }            static Department delete(int departId){          Session s = null;          Transaction tx = null;          try{              s = HibernateUtil.getSession();              tx = s.beginTransaction();              Department depart = (Department)s.get(Department.class, departId); //根據ID查詢              s.delete(depart);                        tx.commit();              return depart;          }finally{              if(s!=null){                  s.close();              }          }      }  }  
可以看到我們定義了兩個方法:add()和delete()

add():在這個方法中,我們在儲存的時候僅僅儲存了Department對象,但是根據cascade="save-update"屬性,兩個Employee對象也會儲存在資料庫中

delete():在這個方法中,我們想通過直接刪除Department對象使得資料庫中與Department表關聯的Employee表中的資料刪除。但是,我們配置的cascade是要求在儲存或者更新的時候發生級聯關係,所以如果我們執行delete()方法後,只會在Department表的資料被刪除,Employee表的資料的外鍵會變成null,但是資料不會被刪除


下邊我們來看下cascade的取值:

Cascade屬性的取值有:

1、none:忽略其他關聯的對象,預設值。

2、save-update:當session通過save(),update(),saveOrUpdate()方法來儲存或更新對象時,級聯儲存所有關聯的建立的臨時對象,並且串聯更新所有關聯的游離對象。

3、persist:當session通過persist()方法來儲存當前對象時,會級聯儲存所有關聯的建立的臨時對象。

4、merge:通過Session的merge()方法來儲存當前對象時,會級聯融合所有關聯的游離對象。

5、delete:通過delete()刪除當前對象時,會串聯刪除所有關聯的對象。

6、lock:通過lock()把當前游離對象加入session緩衝時,會把所有的游離對象也加入Session緩衝中。

7、replicate:通過replicate()複製當前對象時,會級聯複製所有關聯的對象。

8、evict:通過evict()清除session緩衝中對象時,會級聯清除所有關聯的對象。

9、refresh:通過refresh()重新整理當前對象時,會級聯重新整理所有關聯的對象。(重新整理是指同步更新session緩衝中資料)

10、all:save-update(),persist(),merge(),delete(),lock(),replicate(),evict()及refresh()的行為。

11、delete-orphan,刪除所有和當前對象時,解除關聯線為的對象。

12、all-delete-orphan; 通過delete()刪除當前對象時,會串聯刪除所有關聯的對象。





【SSH三大架構】Hibernate基礎第九篇:cascade關聯關係的級聯操作

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.