1. 程式人生 > >Hibernate級聯操作Cascade學之---delete

Hibernate級聯操作Cascade學之---delete

所在cascade,就是說我在更新一方的時候,可以根據這一方物件之間的關聯關係,去對被關聯方進行持久化,比如說Team和Student之間的1對多關係,使用cascade,可以在team方維護其持有的student集合時,自動對其新增,修改,刪除的student物件進行持久化,而沒必要顯示的進行session.save(student)操作,cascade="delete"的意思就是說,我在session.delete(team)的時候,可以一併刪除其所有的student

資料庫指令碼:

createtable student(id varchar(32primarykey,
                     team_id 
varchar(32),
                     name 
varchar(32),
                     cardid 
varchar(32),
                     age 
int);

createtable team(id varchar(32primarykey,
                  team_id 
varchar(32),
                  teamname 
varchar(32));

                         
insertinto team values("1","1","team1");
insertinto student values("1","1","stu1","20070101",22);
insertinto student values("2","1","stu2","20070102",23);

持久化JavaBean

package Cascade.saveUpdate;


publicclass Student {
  
private String id;
  
private String cardid;
  
private String name;
  
privateint age;
  
private Team team;
public String getId() 
{
    
return id;
}

publicvoid setId(String id) {
    
this.id = id;
}

public String getCardid() {
    
return cardid;
}

publicvoid setCardid(String cardid) {
    
this.cardid = cardid;
}

public String getName() {
    
return name;
}

publicvoid setName(String name) {
    
this.name = name;
}

publicint getAge() {
    
return age;
}

publicvoid setAge(int age) {
    
this.age = age;
}


public Team getTeam() {
    
return team;
}

publicvoid setTeam(Team team) {
    
this.team = team;
}

}



package Cascade.saveUpdate;


import java.util.HashSet;
import java.util.Set;

publicclass Team {
   
private String id;
   
private Set students=new HashSet();
   
private String teamName;
public String getId() {
    
return id;
}

publicvoid setId(String id) {
    
this.id = id;
}

public Set getStudents() {
    
return students;
}

publicvoid setStudents(Set students) {
    
this.students = students;
}

public String getTeamName() {
    
return teamName;
}

publicvoid 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
&amp;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;

publicclass Test