hibernate之cascade(一)
TrainingStudent.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="com.hibernate.entity.TrainingStudent" table="training_student" schema="dbo" catalog="pubs"> <id name="id" type="java.lang.Integer"> <column name="id" /> <generator /> </id> <property name="classId" type="java.lang.Integer" insert="false" update="false"> <column name="class_id" /> </property> <property name="stuName" type="java.lang.String"> <column name="stu_name" length="50" /> </property> <many-to-one name="trainingClass" fetch="select" cascade="all" lazy="false" > <column name="class_id" not-null="true"></column> </many-to-one> </class></hibernate-mapping>
?
TrainingClass.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="com.hibernate.entity.TrainingClass" table="training_class" schema="dbo" catalog="pubs"> <id name="id" type="java.lang.Integer"> <column name="id" /> <generator /> </id> <property name="className" type="java.lang.String"> <column name="class_name" length="50" /> </property> <set name="trainingStudent" cascade="all"> <key column="class_id" not-null="false"></key> <one-to-many /> </set> </class></hibernate-mapping>?
?
?
package com.hibernate.entity;import java.util.HashSet;import java.util.Set;public class TrainingClass implements java.io.Serializable {// Fieldsprivate Integer id;private String className;private Set<TrainingStudent> trainingStudent = new HashSet();// Constructors/** default constructor */public TrainingClass() {}// Property accessorspublic Integer getId() {return this.id;}public void setId(Integer id) {this.id = id;}public String getClassName() {return this.className;}public void setClassName(String className) {this.className = className;}public Set<TrainingStudent> getTrainingStudent() {return trainingStudent;}public void setTrainingStudent(Set<TrainingStudent> trainingStudent) {this.trainingStudent = trainingStudent;}}??
?
package com.hibernate.entity;public class TrainingStudent implements java.io.Serializable {// Fieldsprivate Integer id;private Integer classId;private String stuName;private TrainingClass trainingClass;// Constructors/** default constructor */public TrainingStudent() {}// Property accessorspublic Integer getId() {return this.id;}public void setId(Integer id) {this.id = id;}public Integer getClassId() {return this.classId;}public void setClassId(Integer classId) {this.classId = classId;}public String getStuName() {return this.stuName;}public void setStuName(String stuName) {this.stuName = stuName;}public TrainingClass getTrainingClass() {return trainingClass;}public void setTrainingClass(TrainingClass trainingClass) {this.trainingClass = trainingClass;}}?
?以上是例子需要的内容。
one端可以级联修改many端的数据,many端可以级联删除one端。many端可以修改自己数据,但是不能通过many端去修改one端的数据。比如:
?
Session session=HibernateSessionFactory.getSession();
session.beginTransaction();
TrainingStudent ts=(TrainingStudent) session.get(TrainingStudent.class, 6);
ts.setClassId(4);
?
?
ts.setClassId(4);
TrainingClass t1=(TrainingClass) session.get(TrainingClass.class,4);
ts.setTrainingClass(t1);
session.saveOrUpdate(ts);
这样做是允许的,因为它是在修改自身的数据。但是下面这样是不允许的:
ts.getTrainingClass().setId();
因为这是在通过many端去修改one端内部的主键。这样做是不允许的。
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?