Hibernate级联操作Cascade学之---delete所在cascade,就是说我在更新一方的时候,可以根据这一方对象之间的
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"来时实现,可以提高一些效率