Hibernate级联操作Cascade学之---delete
所在cascade,就是说我在更新一方的时候,可以根据这一方对象之间的关联关系,去对被关联方进行持久化,比如说Team和Student之间的1对多关系,使用cascade,可以在team方维护其持有的student集合时,自动对其新增,修改,删除的student对象进行持久化,而没必要显示的进行session.save(student)操作,cascade="delete"的意思就是说,我在session.delete(team)的时候,可以一并删除其所有的student
数据库脚本:

create?table?student(id?varchar(32)?primary?key,

?????????????????????team_id?varchar(32),

?????????????????????name?varchar(32),

?????????????????????cardid?varchar(32),

?????????????????????age?int);


create?table?team(id?varchar(32)?primary?key,

??????????????????team_id?varchar(32),

??????????????????teamname?varchar(32));


?????????????????????????

insert?into?team?values("1","1","team1");

insert?into?student?values("1","1","stu1","20070101",22);

insert?into?student?values("2","1","stu2","20070102",23);


持久化JavaBean

package?Cascade.saveUpdate;



public?class?Student?{

??private?String?id;

??private?String?cardid;

??private?String?name;

??private?int?age;

??private?Team?team;

public?String?getId()?{

????return?id;

}

public?void?setId(String?id)?{

????this.id?=?id;

}

public?String?getCardid()?{

????return?cardid;

}

public?void?setCardid(String?cardid)?{

????this.cardid?=?cardid;

}

public?String?getName()?{

????return?name;

}

public?void?setName(String?name)?{

????this.name?=?name;

}

public?int?getAge()?{

????return?age;

}

public?void?setAge(int?age)?{

????this.age?=?age;

}


public?Team?getTeam()?{

????return?team;

}

public?void?setTeam(Team?team)?{

????this.team?=?team;

}

}



package?Cascade.saveUpdate;



import?java.util.HashSet;

import?java.util.Set;


public?class?Team?{

???private?String?id;

???private?Set?students=new?HashSet();

???private?String?teamName;

public?String?getId()?{

????return?id;

}

public?void?setId(String?id)?{

????this.id?=?id;

}

public?Set?getStudents()?{

????return?students;

}

public?void?setStudents(Set?students)?{

????this.students?=?students;

}

public?String?getTeamName()?{

????return?teamName;

}

public?void?setTeamName(String?teamName)?{

????this.teamName?=?teamName;

}



}

Hibernate.cfg.xml

<?xml?version='1.0'?encoding='UTF-8'?>

<!DOCTYPE?hibernate-configuration?PUBLIC

??????????"-//Hibernate/Hibernate?Configuration?DTD?3.0//EN"

??????????"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">


<!--?Generated?by?MyEclipse?Hibernate?Tools.???????????????????-->

<hibernate-configuration>


<session-factory>

????<property?name="connection.username">root</property>

????<property?name="connection.url">

????????jdbc:mysql://localhost:3306/schoolproject?characterEncoding=gb2312&useUnicode=true

????</property>

????<property?name="dialect">

????????org.hibernate.dialect.MySQLDialect

????</property>

????<property?name="myeclipse.connection.profile">mysql</property>

????<property?name="connection.password">1234</property>

????<property?name="connection.driver_class">

????????com.mysql.jdbc.Driver

????</property>

????<property?name="hibernate.dialect">

????????org.hibernate.dialect.MySQLDialect

????</property>

????<property?name="hibernate.show_sql">true</property>

????<property?name="current_session_context_class">thread</property>

????<property?name="jdbc.batch_size">15</property>

????<mapping?resource="Cascade/delete/Student.hbm.xml"?/>

????<mapping?resource="Cascade/delete/Team.hbm.xml"?/>




</session-factory>


</hibernate-configuration>
Student.hbm.xml

<?xml?version="1.0"?encoding="utf-8"?>

<!DOCTYPE?hibernate-mapping?PUBLIC?"-//Hibernate/Hibernate?Mapping?DTD?3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<!--?

????Mapping?file?autogenerated?by?MyEclipse?-?Hibernate?Tools

-->

<hibernate-mapping>

<class?name="Cascade.delete.Student"?table="student">

??<id?name="id"?unsaved-value="null">

????<generator?class="uuid.hex"></generator>

??</id>

??<property?name="cardid"?type="string"/>

??<property?name="name"?type="string"/>

??<property?name="age"?type="int"/>

??<many-to-one?name="team"?

???????????????column="team_id"

???????????????class="Cascade.delete.Team"

???????????????lazy="no-proxy">

??</many-to-one>

</class>


</hibernate-mapping>

Team.hbm.xml

<?xml?version="1.0"?encoding="utf-8"?>

<!DOCTYPE?hibernate-mapping?PUBLIC?"-//Hibernate/Hibernate?Mapping?DTD?3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<!--?

????Mapping?file?autogenerated?by?MyEclipse?-?Hibernate?Tools

-->

<hibernate-mapping>

<class?name="Cascade.delete.Team"?table="team"?lazy="true">

???????<id?name="id"?column="id">

?????????<generator?class="uuid.hex"></generator>

???????</id>

???????<property?name="teamName"?column="teamname"></property>

??????

???????<set?name="students"?lazy="true"?inverse="false"?cascade="delete">

?????????<key?column="team_id"></key>

?????????<one-to-many?class="Cascade.delete.Student"/>

???????</set>

??????</class>

</hibernate-mapping>

测试代码:

package?Cascade.delete;



import?java.io.File;


import?org.hibernate.Session;

import?org.hibernate.SessionFactory;

import?org.hibernate.Transaction;

import?org.hibernate.cfg.Configuration;


public?class?Test?{



????public?static?void?main(String[]?args)?{


????????String?filePath=System.getProperty("user.dir")+File.separator+"src/Cascade/delete"+File.separator+"hibernate.cfg.xml";

????????File?file=new?File(filePath);

????????System.out.println(filePath);

????????SessionFactory?sessionFactory=new?Configuration().configure(file).buildSessionFactory();

????????Session?session=sessionFactory.openSession();

????????Transaction?t=session.beginTransaction();

????????Student?newStu=new?Student();??//建立一个student对象,瞬态

????????newStu.setCardid("12345");

????????newStu.setAge(22);

????????newStu.setName("newStu");

????????Team?team=(Team)session.get(Team.class,?"1");//获得team对象

????????session.delete(team);//删除team并一并删除其所有拥有的student

????????/*

?????????*?设置cascade="delete"?只能通过session.delete()删除其所有的学生

?????????*?设置cascade="delete-orphan"?可以通过team.getStudents().remove(stu)方式删除学生

?????????*/

????????t.commit();

????????

????}


}

运行结果:
Hibernate: select team0_.id as id1_0_, team0_.teamname as teamname1_0_ from team team0_ where team0_.id=?
Hibernate: select students0_.team_id as team5_1_, students0_.id as id1_, students0_.id as id0_0_, students0_.cardid as cardid0_0_, students0_.name as name0_0_, students0_.age as age0_0_, students0_.team_id as team5_0_0_ from student students0_ where students0_.team_id=?
Hibernate: update student set team_id=null where team_id=?
Hibernate: delete from student where id=?
Hibernate: delete from student where id=?
Hibernate: delete from team where id=?
需要注意的是红色部分的update,照说应该只有select和delete操作,这是因为我们再Team方设置inverse="false"|
这就要求Team要维护Team和Student之间的1对多关系,所以Hibernat将Student的team_id设置成null以断开他么之间的联系,其实这个update是多余的,因为修改后还是被删除了,这点可以通过设置inverse="true"来时实现,可以提高一些效率