cascade是级联操作,使得在操作一端数据时,可以级联操作被关联的另一端的数据。
在多对一的关系中,多的一端不能操作级联为delete。一般在多的一端设为save-update。
在一对多的关系中,如果一的一端设置为delete时,多的一端不能指明外键为非空。
示例:
Student类
public class Student {
private int id;
private String name;
private int age;
private Grade grade;
//省略get/set方法
}
Grade类
public class Grade {
private int id;
private String name;
private Set<Student> students=new HashSet<Student>();
//省略get/set
}
Student.hbm.xml配置文件
<hibernate-mapping package="com.test.pojo">
<class name="Student">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name" />
<property name="age" />
<!-- cascade 级联,让操作级联到子实体
save-update:保存和更新多的一端数据时,一的一端的数据可以一起保存和更新
none:不级联
delete:删除级联,不能在多的一端使用
all:表示所有操作都级联 -->
<many-to-one name="grade" class="Grade" column="grade_Id" cascade="save-update"/>
</class>
</hibernate-mapping>
Grade.hbm.xml配置文件
<hibernate-mapping package="com.test.pojo">
<class name="Grade">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name" />
<!-- set是Grade中的集合属性 name属性名称 -->
<set name="students" >
<!-- key表示外键 column表示外键列名 -->
<key column="grade_Id"/>
<!-- 一对多 类Grade中students所表示类型 -->
<one-to-many class="Student" />
</set>
</class>
</hibernate-mapping>
测试类
public class HibernateTest {
@Test
public void testCreateDB(){
Configuration cfg=new Configuration().configure();
SchemaExport se=new SchemaExport(cfg);
//第一个参数表示是否生成ddl脚本,第二个参数表示是否执行到数据库中
se.create(true, true);
}
/**
* 保存数据
*/
@Test
public void TestSave(){
Session session=null;
Transaction tx=null;
try{
session=HibernateUtil.getSession();
tx=session.beginTransaction();
Grade grade=new Grade();
grade.setName("大一");
Student stu=new Student();
stu.setName("王五");
stu.setAge(20);
stu.setGrade(grade);
Student stu1=new Student();
stu1.setName("李四");
stu1.setAge(20);
stu1.setGrade(grade);
session.save(stu);
session.save(stu1);
tx.commit();
}catch(Exception e){
if(tx!=null)
tx.rollback();
e.printStackTrace();
}finally{
HibernateUtil.closeSession();
}
}
}
具体操作结果在此就不做详细介绍了,感兴趣的可以自己测试下。
============================================================================
接下来我们来看下inverse
inverse设置关系维护方。当inverse="false"时,谁管理谁维护。如果都管理了,那么都维护。当关系由多的一方来维护时,效率高。当关系由一的一方来维护时,会执行update语句。
示例:
Student.hbm.xml配置
<hibernate-mapping package="com.test.pojo">
<class name="Student">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name" />
<property name="age" />
<many-to-one name="grade" class="Grade" column="grade_Id"/>
</class>
</hibernate-mapping>
<hibernate-mapping package="com.test.pojo">
<class name="Grade">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name" />
<!-- set是Grade中的集合属性 name属性名称 -->
<!-- inverse设置由谁来管理关联关系,如果为false则双方都可以管理 -->
<set name="students" inverse="false">
<!-- key表示外键 column表示外键列名 -->
<key column="grade_Id"/>
<!-- 一对多 类Grade中students所表示类型 -->
<one-to-many class="Student" />
</set>
</class>
</hibernate-mapping>
对应关系由多的一方来维护的测试类代码
@Test
public void TestSave(){
Session session=null;
Transaction tx=null;
try{
session=HibernateUtil.getSession();
tx=session.beginTransaction();
Grade grade=new Grade();
grade.setName("大一");
Student stu=new Student();
stu.setName("王五");
stu.setAge(20);
stu.setGrade(grade);
Student stu1=new Student();
stu1.setName("李四");
stu1.setAge(20);
stu1.setGrade(grade);
// grade.getStudents().add(stu);
// grade.getStudents().add(stu1);
session.save(grade);
session.save(stu);
session.save(stu1);
tx.commit();
}catch(Exception e){
if(tx!=null)
tx.rollback();
e.printStackTrace();
}finally{
HibernateUtil.closeSession();
}
}
执行结果如下:
对应关系由一的一端来维护测试代码
@Test
public void TestSave(){
Session session=null;
Transaction tx=null;
try{
session=HibernateUtil.getSession();
tx=session.beginTransaction();
Grade grade=new Grade();
grade.setName("大一");
Student stu=new Student();
stu.setName("王五");
stu.setAge(20);
// stu.setGrade(grade);
Student stu1=new Student();
stu1.setName("李四");
stu1.setAge(20);
// stu1.setGrade(grade);
grade.getStudents().add(stu);
grade.getStudents().add(stu1);
session.save(grade);
session.save(stu);
session.save(stu1);
tx.commit();
}catch(Exception e){
if(tx!=null)
tx.rollback();
e.printStackTrace();
}finally{
HibernateUtil.closeSession();
}
}
执行结果如下:
对应关系既有多的一方又有一的一方同时维护测试代码如下:
@Test
public void TestSave(){
Session session=null;
Transaction tx=null;
try{
session=HibernateUtil.getSession();
tx=session.beginTransaction();
Grade grade=new Grade();
grade.setName("大一");
Student stu=new Student();
stu.setName("王五");
stu.setAge(20);
stu.setGrade(grade);
Student stu1=new Student();
stu1.setName("李四");
stu1.setAge(20);
stu1.setGrade(grade);
grade.getStudents().add(stu);
grade.getStudents().add(stu1);
session.save(grade);
session.save(stu);
session.save(stu1);
tx.commit();
}catch(Exception e){
if(tx!=null)
tx.rollback();
e.printStackTrace();
}finally{
HibernateUtil.closeSession();
}
}
执行结果如下:
inverse="true"时,关系由另一端管理。不管一的一端是否指明关系,一的一端都不会去维护关系。建议inverse="true"。