- 浏览: 118977 次
- 性别:
- 来自: 宁波
文章分类
最新评论
所在cascade,就是说我在更新一方的时候,可以根据这一方对象之间的关联关系,去对被关联方进行持久化,比如说Team和Student之间的1对多关系,使用cascade,可以在team方维护其持有的student集合时,自动对其新增,修改,删除的student对象进行持久化,而没必要显示的进行session.save(student)操作,cascade="delete"的意思就是说,我在session.delete(team)的时候,可以一并删除其所有的student 数据库脚本: 持久化JavaBean Hibernate.cfg.xml Student.hbm.xml Team.hbm.xml 测试代码: 运行结果: Hibernate: select team0_.id as id1_0_, team0_.teamname as teamname1_0_ from team team0_ where team0_.id=? 需要注意的是红色部分的update,照说应该只有select和delete操作,这是因为我们再Team方设置inverse="false"|
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);
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;
}
}
<!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>
<!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>
<!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>
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 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=?
这就要求Team要维护Team和Student之间的1对多关系,所以Hibernat将Student的team_id设置成null以断开他么之间的联系,其实这个update是多余的,因为修改后还是被删除了,这点可以通过设置inverse="true"来时实现,可以提高一些效率
发表评论
-
Open Session In View(转)
2010-12-04 21:58 1114英文原文:http://community.jboss.org ... -
open session in view 研究
2010-12-04 21:54 780在没有使用Spring提供的Open Session In V ... -
Hibernate并发控制
2010-12-04 19:46 10473. 多个事务并发引起的问题:3.1. 第 ... -
servlet和filter的异同
2010-12-04 19:28 995以前总以为filter就是一种特殊servlet,所以他们 ... -
JavaScript,调用函数的5种方法
2010-11-28 16:16 921JavaScript,调用函数的5种方法 一次又一次的,我发现 ... -
IOC原理
2010-11-28 09:18 853IOC(inview of control)控制反转 ... -
HTTP POST GET 本质区别详解
2010-11-27 09:47 864HTTP POST GET 本质区别详解 收藏 ... -
Hibernate二级缓存(转)
2010-11-27 09:38 805Hibernate二级缓存(转 ... -
加速你的Hibernate引擎(下)
2010-11-27 09:37 804加速你的Hibernate引擎(下) 文章分类:Ja ... -
加速你的Hibernate引擎(上)
2010-11-27 09:36 880加速你的Hibernate引擎(上) 文章分类:Ja ... -
spring Transaction Manager和hibernate session
2010-11-27 09:33 1088spring Transaction Manager ... -
浅析Spring提供的事务管理方法
2010-11-27 09:32 815浅析Spring提供的事务管理方法 2006-0 ... -
hibernate性能优化
2010-11-27 09:24 665转 hibernate性能优化 ... -
Hibernate 性能优化技巧
2010-11-27 09:23 767转 Hibernate 性能优化 ... -
Hibernate乐观锁实现之Timestamp
2010-11-27 09:21 888转 Hibernate乐观锁实现之Timestamp ... -
Hibernate乐观锁实现之Version
2010-11-27 09:21 846转 Hibernate乐观锁实现之Version ... -
Hibernate悲观锁定与乐观锁定区别
2010-11-27 09:20 704转 Hibernate悲观锁定 ... -
Hibernate二级缓存 ---- 最佳实践
2010-11-27 09:19 913转 Hibernate二级缓存 ---- 最佳实践 ... -
Spring如何与struts2结合
2010-11-22 12:34 9684.Spring如何与struts2结合 关键字: ... -
struts2 iterator
2010-11-21 21:12 929struts2的s:iterator 可以遍历 数据栈里面 ...
相关推荐
一、Hibernate级联(Cascade) 级联操作允许我们将对一个实体的更改自动应用到与之关联的其他实体。在一对多关系中,如果一个实体(父实体)与多个实体(子实体)关联,设置级联属性可以确保在处理父实体时,子实体...
在Hibernate中,级联操作可以通过`cascade`属性进行配置。主要有以下几种级联类型: 1. `save-update`:当保存或更新父实体时,会自动保存或更新所有关联的子实体。 2. `merge`:在调用`session.merge()`时,不仅...
在这个例子中,父实体的`childEntity`属性将执行全部级联操作,包括添加、删除和更新,同时`delete-orphan`意味着如果从父实体的集合中移除了子实体,那么这个子实体也将被从数据库中删除。 6. 性能与最佳实践 级联...
3. **all-delete-orphan**: 这是最强大的cascade选项之一,它结合了`save-update`和`delete`的特点,并增加了一个额外的功能——当子实体与父实体之间的关联被解除时,会自动删除那些不再属于任何父实体的子实体。...
### Hibernate级联(Cascade)详解 #### 一、概述 Hibernate 是一款强大的对象关系映射 (ORM) 框架,它允许开发人员将 Java 对象模型映射到数据库表,从而极大地简化了数据访问层的开发工作。在 Hibernate 中,...
在 Hibernate 中,级联操作(Cascade)和反向属性(Inverse)是管理对象关系的重要概念,特别是在处理一对多(One-to-Many)或多对一(Many-to-One)关系时。 **级联操作(Cascade)** 级联操作定义了当主对象被...
"common_ssh"这个文件名可能是某种归档或项目名,与SSH(Secure Shell)协议有关,但在这个上下文中,它与Hibernate级联查询的主题没有直接联系。可能是其他项目的通用配置文件或者库,或者仅仅是上传资料时的一个...
### Hibernate Many-to-One (多对一) 及 Cascade (级联) #### 一、Many-to-One(多对一) 在数据库设计中,实体之间的关系主要包括一对一、一对多、多对多等几种类型。而在ORM(对象关系映射)框架Hibernate中,...
本主题将深入探讨"hibernate级联增删改查",特别是针对"t_card主表"和"t_person从表"的关系。 首先,级联操作在Hibernate中是一种配置,用于指定当主表中的实体发生变化时,是否以及如何更新或删除关联的从表实体。...
级联操作的设置方式有多种,对于一对一和多对一的关系,可以通过`cascade="delete"`或`cascade="all"`,而对于一对多的关系,可以选择`cascade="all-delete-orphan"`或`cascade="all"`。`delete`只在删除父对象时...
- `cascade="delete"`:表示只有删除操作会被级联执行。 - **应用示例** - **一对多**:例如,在`Department`和`Employee`的关系中,如果`Department`设置了`cascade="all"`,那么当更新或删除部门时,相关的员工...
### Hibernate基础之关联映射与级联操作 #### 第一部分:主键生成策略与对象状态管理 ##### 主键生成策略 在使用Hibernate框架时,合理的主键生成策略能够极大地简化开发工作并提升应用性能。Hibernate提供了多种...
cascade 属性用于控制级联操作的行为,它决定了在执行某个操作时是否同时对关联的实体也执行相同的操作。以下是一些可能的值: - all: 执行所有级联操作。 - none: 不执行任何级联操作。 - save-update: 只有在执行...
- `all-delete-orphan`:除了 `all` 操作外,还会删除与父对象失去关联的子对象。 例如,假设有一个 `Course` 类关联着多个 `Student` 类,如果在 `Course` 上设置了 `cascade="save-update"`,那么当保存或更新 `...
级联操作(Cascade)是Hibernate的一个特性,它允许我们将一个实体的操作(如保存、更新、删除等)自动应用到与其关联的其他实体上。例如,如果我们在删除一个学生时希望同时删除该学生选的所有课程,就可以使用级联...
例如,`cascade=none`表示不进行任何级联操作,而`cascade=all`则表示在所有情况下都进行级联操作,包括保存、更新和删除。`save-update`仅在保存或更新主对象时级联,`delete`则只在删除主对象时级联。合理设置级联...
例如,如果`Teacher`和`Student`的关系设置了`cascade="all-delete-orphan"`,当一个`Student`从`Teacher`的`items`集合中移除时,Hibernate会在数据库中相应地删除这个`Student`。 **2. Hibernate Inverse** `...
- `cascade="all-delete-orphan"`:结合`all`和`delete-orphan`特性,当从集合中移除对象时,会立即从数据库中删除该对象。 ### 三、持久化对象状态管理 #### 持久对象状态分类 - **Transient临时态**:仅存在于...