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"来时实现,可以提高一些效率
数据库脚本:
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"来时实现,可以提高一些效率
相关文章推荐
- 【Hibernate】级联操作 cascade 选项
- 【SSH三大框架】Hibernate基础第九篇:cascade关联关系的级联操作
- 【SSH三大框架】Hibernate基础第九篇:cascade关联关系的级联操作
- 级联操作--on delete/update cascade
- Hibernate的Cascade——级联操作
- Hibernate级联操作cascade
- Hibernate入门(五)hibernate的级联(cascade)表操作
- Hibernate入门(五)hibernate的级联(cascade)表操作
- Hibernate级联操作和加载机制(一) cascade and fetch
- hibernate的级联操作cascade
- Hibernate入门(五)hibernate的级联(cascade)表操作
- Hibernate 级联操作 cascade
- Hibernate中级联操作cascade选项
- Hibernate中级联操作cascade选项
- Hibernate级联操作和加载机制(二) cascade and fetch
- Hibernate的Cascade——级联操作
- Hibernate 级联操作cascade及inverse
- Hibernate级联操作Cascade
- Hibernate级联操作Cascade学之---save-update
- 谈论Hibernate级联删除——JPA根据Hibernate实现许多级联删除CascadeType.DELETE_ORPHAN