cascade 级联操作
-null 默认值
-sava-update
在保存classes对象的时候,针对student进行保存或者更新操作
在更新classes对象的时候,针对student进行保存或者更新操作
-all 包括sava-update和delete
-delete 将classes中的student删除时,将student表中的student删除
inverse 关系操作(设置维护后将为student添加外键数据,不维护外键为null)
-default classes维护classes与student之间的关系
-true classes不维护classes与student之间的关系
-false classes维护classes与student之间的关系
-null 默认值
-sava-update
在保存classes对象的时候,针对student进行保存或者更新操作
在更新classes对象的时候,针对student进行保存或者更新操作
-all 包括sava-update和delete
-delete 将classes中的student删除时,将student表中的student删除
inverse 关系操作(设置维护后将为student添加外键数据,不维护外键为null)
-default classes维护classes与student之间的关系
-true classes不维护classes与student之间的关系
-false classes维护classes与student之间的关系
有两个对象
package cn.xhx.hibernate.domain;
import java.io.Serializable;
import java.util.Set;
public class Classes implements Serializable{
private Long cid;
private String name;
private String description;
private Set<Student> students;//关联对象
public Long getCid() {
return cid;
}
public void setCid(Long cid) {
this.cid = cid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
}
}
package cn.xhx.hibernate.domain;
import java.io.Serializable;
public class Student implements Serializable {
private Long sid;
private String name;
private String description;
public Long getSid() {
return sid;
}
public void setSid(Long sid) {
this.sid = sid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
Classes对象的配置文件Classes.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">
<hibernate-mapping>
<class name="cn.xhx.hibernate.domain.Classes" table="classes">
<id name="cid" length="5">
<!-- 主键产生器
-increment 先找到主键的最大值,在最大值的基础上加1,所以该主键必须是数值类型
-assigned 在程序中手动设置主键的值
-identity 表的自动增长机制,主键必须是数字类型,该效率比increment高,但是id不连续
-uuid uuid字符串是由hibernate内部产生的,要求之间必须是字符串类型
-sequence 支持oracle的数据库
-->
<generator class="increment"></generator>
</id>
<property name="name" length="20"></property>
<property name="description" length="50"></property>
<!--
set元素针对的就是Classes类中的set属性
cascade 级联操作
-null 默认值
-sava-update
在保存classes对象的时候,针对student进行保存或者更新操作
在更新classes对象的时候,针对student进行保存或者更新操作
-all 包括sava-update和delete
-delete 将classes中的student删除时,将student表中的student删除
inverse 关系操作(设置维护后将为student添加外键数据,不维护外键为null)
-default classes维护classes与student之间的关系
-true classes不维护classes与student之间的关系
-false classes维护classes与student之间的关系
-->
<set name="students" cascade="save-update" inverse="false">
<key>
<column name="cid"></column>
</key>
<one-to-many class="cn.xhx.hibernate.domain.Student"/>
</set>
</class>
</hibernate-mapping>
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">
<hibernate-mapping>
<class name="cn.xhx.hibernate.domain.Student">
<id name="sid" length="5">
<generator class="increment"></generator>
</id>
<property name="name" length="20"></property>
<property name="description" length="50"></property>
</class>
</hibernate-mapping>
/**
* 在更新班级的时候,级联保存学生,并且维护关系,此程序Hibernate的语句如下
* Hibernate:
select
classes0_.cid as cid0_0_,
classes0_.description as descript2_0_0_,
classes0_.name as name0_0_
from
Classes classes0_
where
classes0_.cid=?
Hibernate:
select
students0_.cid as cid0_1_,
students0_.sid as sid1_,
students0_.sid as sid1_0_,
students0_.description as descript2_1_0_,
students0_.name as name1_0_
from
Student students0_
where
students0_.cid=?
Hibernate:
select
max(sid)
from
Student
Hibernate:
<strong> 因为在Classes.hbm.xml文件中设置了级联,所以在添加Classes时会级联添加Student
<set name="students" cascade="save-update"></strong>
insert
into
Student
(description, name, sid)
values
(?, ?, ?)
Hibernate:
<strong> 因为在Classes.hbm.xml文件中,inverse没有写,默认classes维护classes与student之间的关系
所以发出了更新关系的update语句为student添加外键</strong>
update
Student
set
cid=?
where
sid=?
*/
@Test
public void testUpdateClasses_Cascade_Save_Student_Inverse(){
Session session = sessionFactory.getCurrentSession();
Transaction transaction = session.beginTransaction();
/*
* 给cid为2的班级添加一个学生
*/
Classes classes = (Classes)session.get(Classes.class, 2L);
Student student = new Student();
student.setName("美女1");
student.setDescription("小林志玲");
/**
* 建立班级与学生的关联
*/
classes.getStudents().add(student);
transaction.commit();
}