hibernate中cascade和inverse区别

来源:互联网 发布:淘宝直通车退款 编辑:程序博客网 时间:2024/05/29 05:02
   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(); }





0 0
原创粉丝点击