hibernate中cascade和inverse区别

   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之间的关系

有两个对象
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();
 }





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值