7.3.1级联操作--inverse
Posted chxbar.cn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了7.3.1级联操作--inverse相关的知识,希望对你有一定的参考价值。
1. Inverse设置关系维护方。当inverse=”false”时,谁管理关系谁维护。如果都管理了,那么都维护。当关系由多的一端来维护时,效率较高。当关系由一的一端来维护时。会多执行update语句。
2.Inverse=”true”时,关系由另一端管理。不管一的一端是否指明关系,一的一端都不会去维护关系。都由多的一端负责。建议inverse=”true”.
3.Grade和Student类:
public class Grade { private int id; private String name; private Set<Student> students = new HashSet<Student>(0); /*省略get/set*/
public class Student { private int id; private String name; private int age; private Grade grade; /*省略get/set*/
4.配置文件
Grade.hbm.xml【令inverse=false,之后在步骤7再测试inverse=true】
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.siggy.pojo"> <class name="Grade"> <id name="id"> <generator class="native"></generator> </id> <property name="name"/> <!-- set是 Grade中的集合属性 name属性名称 --> <!-- inverse设置由谁来管理关系 如果为false则双方都可以管理关系 如果为true则关系由另一方来管理,且必须由多的一方来管理,默认 inverse=false--> <set name="students" inverse="false"> <!-- key表示外键 column外键列名--> <key column="grade_id"></key> <!-- one-to-many 一对多 类Grade 中 students 所表示类型 --> <one-to-many class="Student"/> </set> </class> </hibernate-mapping>
Student.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.siggy.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" ></many-to-one> </class> </hibernate-mapping>
5.0 测试代码【当inverse=false时的测试结果】
package cn.siggy.test; import java.sql.SQLException; import javax.sql.rowset.serial.SerialException; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.Configuration; import org.hibernate.tool.hbm2ddl.SchemaExport; import org.junit.Test; import cn.siggy.pojo.Grade; import cn.siggy.pojo.Student; import cn.siggy.util.HibernateUtil; 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() throws HibernateException, SerialException, SQLException{ 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(22); // stu.setGrade(grade); // Student stu1 = new Student(); // stu1.setName("老王"); // stu1.setAge(23); // stu1.setGrade(grade); // // grade.getStudents().add(stu); // grade.getStudents().add(stu1); // session.save(grade); // session.save(stu); // session.save(stu1); /*方式二:一的一端维护关系*/ Student stu = new Student(); stu.setName("张三疯"); stu.setAge(22); Student stu1 = new Student(); stu1.setName("老王"); stu1.setAge(23); grade.getStudents().add(stu); grade.getStudents().add(stu1); session.save(grade); session.save(stu); session.save(stu1); // /*方式三:由多的一方维护关系*/ // Student stu = new Student(); // stu.setName("张三疯"); // stu.setAge(22); // stu.setGrade(grade); // Student stu1 = new Student(); // stu1.setName("老王"); // stu1.setAge(23); // stu1.setGrade(grade); // // session.save(grade); // session.save(stu); // session.save(stu1); tx.commit(); }catch (HibernateException e) { if(tx!=null) tx.rollback(); e.printStackTrace(); throw e; }finally{ HibernateUtil.closeSession(); } } @Test public void testGet(){ Session session = null; Transaction tx = null; try{ session = HibernateUtil.getSession(); tx = session.beginTransaction(); // Grade grade = (Grade)session.get(Grade.class, 1); // session.delete(grade); Student stu = (Student) session.get(Student.class, 1); session.delete(stu); tx.commit(); }catch (HibernateException e) { if(tx!=null) tx.rollback(); e.printStackTrace(); //throw e; }finally{ HibernateUtil.closeSession(); } } }
6.测试结果:
1.方式一:双方式都维护关系
控制台信息:
数据库表信息:
2.方式二:由一的一端维护关系【结果和方式一一样】
3.方式三:由多的一端维护关系
控制台信息:
数据库表信息:
7.当inverse=true时,测试结果如下:【关系由另一方维护,且必须由多的一方维护】
1.方式一:
2.方式二:【多的一方没有维护,故student表的grade_id=null】
3.方式三:
以上是关于7.3.1级联操作--inverse的主要内容,如果未能解决你的问题,请参考以下文章
hibernate基础17:cascade 级联 与 Inverse 反转
hibernate基础17:cascade 级联 与 Inverse 反转