Hibernate中的级联和关系维护

来源:互联网 发布:学淘宝美工视频教程 编辑:程序博客网 时间:2024/05/21 20:28

cascade和inverse(Employee-Department)

1. Cascade用来说明当主对象进行某种操作时是否对其关联的从对象也做类似的操作,常用cascade;

2. cascade的属性取值有以下几种:

         none(默认值)

         all(对所有的操作都进行级联)

         save-update(只有在保存和更新时做级联操作)

         delete(在删除时做级联操作)

         delete-orphan(one-to-many)

         lock,refresh,evict,replicate,persist,merge

        一般对many-to-one,many-to-many不设置级联,在one-to-one和one-to-many中设置级联(查了一些资料,据说一对一主键关联中默认设置了insert、update级联,即使声明cascade="none",这两种级联也是有效的。但delete级联却没有设置)。

3. inverse表示“是否放弃维护关联关系”(在java里两个对象产生关联时,对数据库表的影响)

    在one-to-many和many-to-many的集合定义中使用,inverse="true"表示该对象不维护关联关系;

    该属性的值一般在使用有序集合时设置成“false”(注意Hibernate的缺省值是false)

    one-to-many维护关联关系就是更新外键。many-to-many维护关联关系就是在中间表增减记录。

4. 注意:配置成one-to-one的对象不维护关联关系

/***************************************************************************************/

下面就以部门表和员工表为例来具体说明一下:

Department.java:

package cn.itcast.hibernate.domain;

import java.util.Map;

public class Department {

private int departID;
private String departName;
//在定义集合的时候一定定义成接口形式
// private Set<Employee> emps;//一对多,一个部门对应多个员工
// private List<Employee> emps;
private Map<String,Employee> emps;      //这里牵扯到一个级联操作,来看Department.hbm.xml怎么配置
public int getDepartID() {
   return departID;
}
public void setDepartID(int departID) {
   this.departID = departID;
}
public String getDepartName() {
   return departName;
}
public void setDepartName(String departName) {
   this.departName = departName;
}
/* public Set<Employee> getEmps() {
   return emps;
}
public void setEmps(Set<Employee> emps) {
   this.emps = emps;
}
*/
/*public List<Employee> getEmps() {
   return emps;
}
public void setEmps(List<Employee> emps) {
   this.emps = emps;
}*/
public Map<String, Employee> getEmps() {
   return emps;
}
public void setEmps(Map<String, Employee> emps) {
   this.emps = emps;
}



}

/***********************************************************************************/

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">
   
   <id name="departID">
    <generator class="native"/>
   </id>
    
   <property name="departName" />
    <map name="emps" cascade="save-update">   //这样在保存和更新部门信息的时候,会级联更新部门表中的外键
    <key column="depart_id"></key>
    <map-key type="string" column="key1"></map-key>
    <one-to-many class="Employee" />
   </map>
</class>

</hibernate-mapping>

/********************************************************************************/

下面看测试类:(这里只列出主要代码)

Employee emp = new Employee();
    emp.setEmpName("李全党");
   
    Employee emp1 = new Employee();
    emp1.setEmpName("张子琪");
   
    Department depart = new Department();
    depart.setDepartName("人事管理");
    Map<String,Employee> emps = new HashMap<String,Employee>();
    emps.put(emp.getEmpName(),emp);
    emps.put(emp.getEmpName(),emp1);//对象模型:建立两个对象的关联

//如果在Department.hbm.xml里配置啦inverse="true",那么下面这句话就不会起作用

//在Employee表里depart_id和key1这两个字段都会为空null。不会更新外键。
   depart.setEmps(emps);

    Department depart1 = new Department();
    depart1.setDepartName("研发部");

   
    session = HibernateUtils.getSession();
    tx = session.beginTransaction();
   
    //在设置好cascade属性后,在这里只保存部门信息就行啦,Hibernate会进行级联操作
   // session.save(emp);
   // session.save(emp1);
    session.save(depart);
    session.save(depart1);

   
    tx.commit();
  

下面看截图:

在没有设置inverse的时候(默认inverse="false"),这样Hibernate就会维护对象的关联关系:

在设置inverse="true" ,这样Hibernate就会放弃关联,不会更新外键depart_id:

0 0
原创粉丝点击