您的位置:首页 > 其它

Hibernate级联操作Cascade学之---delete

2007-12-04 15:15 525 查看
所在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"来时实现,可以提高一些效率
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: