`
footman265
  • 浏览: 118977 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

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

    博客分类:
  • SSH
阅读更多

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

数据库脚本:

create table student(id varchar(32primary key,
                     team_id 
varchar(32),
                     name 
varchar(32),
                     cardid 
varchar(32),
                     age 
int);

create table team(id varchar(32primary 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
&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;

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和inverse)一对多

    一、Hibernate级联(Cascade) 级联操作允许我们将对一个实体的更改自动应用到与之关联的其他实体。在一对多关系中,如果一个实体(父实体)与多个实体(子实体)关联,设置级联属性可以确保在处理父实体时,子实体...

    hibernate many-to-many级联保存,级联更新,级联删除

    在Hibernate中,级联操作可以通过`cascade`属性进行配置。主要有以下几种级联类型: 1. `save-update`:当保存或更新父实体时,会自动保存或更新所有关联的子实体。 2. `merge`:在调用`session.merge()`时,不仅...

    Hibernate的级联操作(增,删,该)

    在这个例子中,父实体的`childEntity`属性将执行全部级联操作,包括添加、删除和更新,同时`delete-orphan`意味着如果从父实体的集合中移除了子实体,那么这个子实体也将被从数据库中删除。 6. 性能与最佳实践 级联...

    hibernate_配置cascade_及all-delete-orphan.doc

    3. **all-delete-orphan**: 这是最强大的cascade选项之一,它结合了`save-update`和`delete`的特点,并增加了一个额外的功能——当子实体与父实体之间的关联被解除时,会自动删除那些不再属于任何父实体的子实体。...

    Hibernate cascade (级联).doc

    ### Hibernate级联(Cascade)详解 #### 一、概述 Hibernate 是一款强大的对象关系映射 (ORM) 框架,它允许开发人员将 Java 对象模型映射到数据库表,从而极大地简化了数据访问层的开发工作。在 Hibernate 中,...

    Hibernate级联操作.docx

    在 Hibernate 中,级联操作(Cascade)和反向属性(Inverse)是管理对象关系的重要概念,特别是在处理一对多(One-to-Many)或多对一(Many-to-One)关系时。 **级联操作(Cascade)** 级联操作定义了当主对象被...

    hibernate 级联查询

    "common_ssh"这个文件名可能是某种归档或项目名,与SSH(Secure Shell)协议有关,但在这个上下文中,它与Hibernate级联查询的主题没有直接联系。可能是其他项目的通用配置文件或者库,或者仅仅是上传资料时的一个...

    hibernate many-to-one(多对一)及 cascade(级联).doc

    ### Hibernate Many-to-One (多对一) 及 Cascade (级联) #### 一、Many-to-One(多对一) 在数据库设计中,实体之间的关系主要包括一对一、一对多、多对多等几种类型。而在ORM(对象关系映射)框架Hibernate中,...

    hibernate级联增删改查

    本主题将深入探讨"hibernate级联增删改查",特别是针对"t_card主表"和"t_person从表"的关系。 首先,级联操作在Hibernate中是一种配置,用于指定当主表中的实体发生变化时,是否以及如何更新或删除关联的从表实体。...

    关于Hibernate级联删除的问题.doc

    级联操作的设置方式有多种,对于一对一和多对一的关系,可以通过`cascade="delete"`或`cascade="all"`,而对于一对多的关系,可以选择`cascade="all-delete-orphan"`或`cascade="all"`。`delete`只在删除父对象时...

    hibernate inverse和cascade的详细讲解

    - `cascade="delete"`:表示只有删除操作会被级联执行。 - **应用示例** - **一对多**:例如,在`Department`和`Employee`的关系中,如果`Department`设置了`cascade="all"`,那么当更新或删除部门时,相关的员工...

    hibernate基础 二 关联映射 级联操作

    ### Hibernate基础之关联映射与级联操作 #### 第一部分:主键生成策略与对象状态管理 ##### 主键生成策略 在使用Hibernate框架时,合理的主键生成策略能够极大地简化开发工作并提升应用性能。Hibernate提供了多种...

    hibernate-mapping参数详解

    cascade 属性用于控制级联操作的行为,它决定了在执行某个操作时是否同时对关联的实体也执行相同的操作。以下是一些可能的值: - all: 执行所有级联操作。 - none: 不执行任何级联操作。 - save-update: 只有在执行...

    Hibernate中cascade和inverse应用

    - `all-delete-orphan`:除了 `all` 操作外,还会删除与父对象失去关联的子对象。 例如,假设有一个 `Course` 类关联着多个 `Student` 类,如果在 `Course` 上设置了 `cascade="save-update"`,那么当保存或更新 `...

    Hibernate many-to-many

    级联操作(Cascade)是Hibernate的一个特性,它允许我们将一个实体的操作(如保存、更新、删除等)自动应用到与其关联的其他实体上。例如,如果我们在删除一个学生时希望同时删除该学生选的所有课程,就可以使用级联...

    hibernate映射文件的详解

    例如,`cascade=none`表示不进行任何级联操作,而`cascade=all`则表示在所有情况下都进行级联操作,包括保存、更新和删除。`save-update`仅在保存或更新主对象时级联,`delete`则只在删除主对象时级联。合理设置级联...

    Hibenate cascade

    例如,如果`Teacher`和`Student`的关系设置了`cascade="all-delete-orphan"`,当一个`Student`从`Teacher`的`items`集合中移除时,Hibernate会在数据库中相应地删除这个`Student`。 **2. Hibernate Inverse** `...

    hibernate 学习笔记3

    - `cascade="all-delete-orphan"`:结合`all`和`delete-orphan`特性,当从集合中移除对象时,会立即从数据库中删除该对象。 ### 三、持久化对象状态管理 #### 持久对象状态分类 - **Transient临时态**:仅存在于...

Global site tag (gtag.js) - Google Analytics