Inverse属性

Inverse属性,是在维护关联关系的时候起作用的。 表示控制权是否转移。(在一的一方起作用)

Inverse = true, 控制反转。

Inverse = false  不反转;   当前方有控制权

True  控制反转; 当前方没有控制权

<set name="emps" table="t_Employee" cascade="save-update,delete" inverse="false">
		 	<key column="dept_id"></key>
		 	<one-to-many class="Employee"/>
</set>

在一对多的维护关联关系中,是否设置inverse属性:

1. 保存数据

          有影响。

如果设置控制反转,即inverse=true, 然后通过部门方维护关联关系。在保存部门的时候,同时保存员工, 数据会保存,但关联关系不会维护。即外键字段为NULL

测试结果如下:

2. 获取数据

3. 解除关联关系?

有影响

inverse=false,  可以解除关联

inverse=true,  当前(部门)没有控制权,不能解除关联关系(不会生成update语句,也不会报错)

测试如下:

        //解除关系
	@Test
	public void testRemoveRelation() {
		Session session=sf.openSession();
		session.beginTransaction();

		//获取部门
		Dept dept=(Dept)session.get(Dept.class, 2);
		//解除关系
		dept.getEmps().clear();

		session.getTransaction().commit();
		session.close();

	}

4. 删除数据对关联关系的影响?

       有影响。

inverse=false, 有控制权, 可以删除。先清空外键引用,再删除数据。

inverse=true,  没有控制权: 如果删除的记录有被外键引用,会报错,违反外键约束!  如果删除的记录没有被引用,可以直接删除。


cascade 属性

cascade  表示级联操作  【可以设置到一的一方或多的一方】

none          不级联操作, 默认值

save-update     级联保存或更新

delete                  级联删除

save-update,delete    级联保存、更新、删除

all                 同上。级联保存、更新、删除

 hibernate常见面试题: inverse与cascade区别?

Cascade代表是否执行级联操作,Inverse代表是否由己方维护关系。
测试如下:

        /**
	 * 级联删除
	 */
	@Test
	public void delete() {
		Session session=sf.openSession();
		session.beginTransaction();

		//获取部门
		Dept dept=(Dept)session.get(Dept.class, 4);
		session.delete(dept);

		session.getTransaction().commit();
		session.close();

	}

会直接把Dept表的主键为4的元组删除,同时也会删除另外一张表中关联了该属性且值为4的记录


多对多映射

概述:

代码示例:

1、JavaBean

Project.java

package com.gqx.manytomany;

import java.util.HashSet;
import java.util.Set;

/**
 * 封装项目信息
 * @author 郭庆兴
 *
 */
public class Project {
	private int prj_id;
	private String prj_name;
	//项目下的多个员工
	private Set<Developer> developers=new HashSet<Developer>();

	public int getPrj_id() {
		return prj_id;
	}
	public void setPrj_id(int prj_id) {
		this.prj_id = prj_id;
	}
	public String getPrj_name() {
		return prj_name;
	}
	public void setPrj_name(String prj_name) {
		this.prj_name = prj_name;
	}
	public Set<Developer> getDevelopers() {
		return developers;
	}
	public void setDevelopers(Set<Developer> developers) {
		this.developers = developers;
	}

}

Developer.java

package com.gqx.manytomany;

import java.util.HashSet;
import java.util.Set;

/**
 * 开发人员信息
 * @author 郭庆兴
 *
 */
public class Developer {
	private int d_id;
	private String d_name;
	//开发人员,参与多个项目
	private Set<Project> projects=new HashSet<Project>();

	public int getD_id() {
		return d_id;
	}
	public void setD_id(int d_id) {
		this.d_id = d_id;
	}
	public String getD_name() {
		return d_name;
	}
	public void setD_name(String d_name) {
		this.d_name = d_name;
	}
	public Set<Project> getProjects() {
		return projects;
	}
	public void setProjects(Set<Project> projects) {
		this.projects = projects;
	}

}

2、映射文件

Developer.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="com.gqx.manytomany">

	<class name="Developer" table="t_developer" >
		<id name="d_id">
			<generator class="native"></generator>
		</id>
		<property name="d_name" length="20"></property>

		<!--
			多对多的映射关系:
			1、映射的集合的属性 name
			2、集合属性,对应的中间表:"t_relation"
			3、外键字段:did
			4、外键字段,对应的中间表(t_relation)的字段:prjId"
			5、集合元素的类型
		 -->
		 <set name="projects" table="t_relation" >
		 	<key column="did"></key>
		 	<many-to-many column="prjId" class="Project"></many-to-many>
		 </set>
	</class>

</hibernate-mapping>

Project.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="com.gqx.manytomany">

	<class name="Project" table="t_project" >
		<id name="prj_id">
			<generator class="native"></generator>
		</id>
		<property name="prj_name" length="20"></property>

		<!--
			多对多的映射关系:
			1、映射的集合的属性
			2、集合属性,对应的中间表:"t_relation"
			3、外键字段:prjId
			4、外键字段,对应的中间表(t_relation)的字段:did
			5、集合属性元素的类型
		 -->
		 <set name="developers" table="t_relation" inverse="false">
		 	<key column="prjId"></key>
		 	<many-to-many column="did" class="Developer"></many-to-many>
		 </set>
	</class>

</hibernate-mapping>

3、测试类

package com.gqx.manytomany;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

public class Demo {
	private static SessionFactory sf;
	static{
		sf=new Configuration().
				configure().
				addClass(Developer.class).addClass(Project.class)
				.buildSessionFactory();
	}

	//只能通过一方维护另一方,不能重复维护
	//developer_zs.getProjects().add(project_oa);
	//但是在一对多或是多对一种,是候可以的
	@Test
	public void test() {
		Session session=sf.openSession();
		session.beginTransaction();

		 //创建项目对象
		Project project_ds=new Project();
		project_ds.setPrj_name("电商系统");
		Project project_oa=new Project();
		project_oa.setPrj_name("OA系统");
		//创建员工对象
		Developer developer_zs=new Developer();
		developer_zs.setD_name("张三");
		Developer developer_ls=new Developer();
		developer_ls.setD_name("李四");
		Developer developer_ww=new Developer();
		developer_ww.setD_name("王五");
		//关系	通过项目方来保存
		project_ds.getDevelopers().add(developer_ww);
		project_ds.getDevelopers().add(developer_ls);
		project_oa.getDevelopers().add(developer_ls);
		project_oa.getDevelopers().add(developer_zs);

		session.save(project_oa);
		session.save(project_ds);
		session.save(developer_ww);
		session.save(developer_ls);
		session.save(developer_zs);

		session.getTransaction().commit();
		session.close();

	}

	//解除关系
	@Test
	public void testRemoveRelation() {
		Session session=sf.openSession();
		session.beginTransaction();

		Project prj=(Project)session.get(Project.class, 1);
		prj.getDevelopers().clear();

		session.getTransaction().commit();
		session.close();
	}

	//删除
	/*
	 * inverse=true:有控制权,先删除中间表,在删除自身
	 * inverse=false:没有控制权。不能删除
	 */
	@Test
	public void testRemove() {
		Session session=sf.openSession();
		session.beginTransaction();

		Project prj=(Project)session.get(Project.class, 2);
		session.delete(prj);

		session.getTransaction().commit();
		session.close();
	}

}

Inverse属性和cascade属性以及集合的多对多关系的更多相关文章

  1. Hibernate中inverse属性与cascade属性

    Hibernate集合映射中,经常会使用到"inverse"和"cascade"这两个属性.对于我这样,Hibernate接触不深和语文水平够烂的种种因素,发现 ...

  2. Hibernate--inverse属性与cascade属性

    转载:http://www.cnblogs.com/otomedaybreak/archive/2012/01/17/2324772.html Hibernate 集合映射中,经常会使用到" ...

  3. Hibernate第五篇【inverse、cascade属性详解】

    前言 上一篇博文已经讲解了一对多和多对一之间的关系了,一对多和多对一存在着关联关系(外键与主键的关系).本博文主要讲解Inverse属性.cascade属性.这两个属性对关联关系都有影响 Invers ...

  4. Hibernate中的inverse和cascade属性

    Hibernate中的inverse和cascade属性 inverse的值有两种,"true"和"false".inverse="false&quo ...

  5. (转)Hibernate框架基础——cascade属性

    http://blog.csdn.net/yerenyuan_pku/article/details/52760010 我们以部门和员工的关系为例讲解一对多关联关系映射时,删除部门时,如果部门有关联的 ...

  6. 一对多(多对一)关系中的inverse和cascade属性

    转载请标明出处 http://www.cnblogs.com/haozhengfei/p/6049276.html 首先说一下inverse: "inverse" 直译过来就是&q ...

  7. Hibernate【inverse和cascade属性】知识要点

    Inverse属性 Inverse属性:表示控制权是否转移.. true:控制权已转移[当前一方没有控制权] false:控制权没有转移[当前一方有控制权] Inverse属性,是在维护关联关系的时候 ...

  8. Hibernate之cascade属性和inverse属性

    1.cascade属性 cascade属性的作用是描述关联对象进行操作时的级联特性,只有涉及关系的元素才有cascade属性.具有cascade属性的标记包括<many-to-one/>. ...

  9. hibernate中一对多关系中的inverse,cascade属性

    举例说明: 一对多关系的两张表:boy.girl(一个男孩可以多个女朋友) boy表结构 Field   Type        ------  -----------  name    varcha ...

随机推荐

  1. c#-委托,匿名方法,lambda表达的关系

    什么是委托: 包含单个方法的委托和函数指针是相似的,不同的是,委托是面向帝乡的并且是类型安全的 声明委托类型: delegate void mydel(int x); 声明委托和声明方法差不多,两个不 ...

  2. java基础练习 11

    import java.util.Scanner; public class Eleventh { /*给一个不多于5位的正整数,要求:一.求它是几位数,二.逆序打印出各位数字. (5 分数)*/ p ...

  3. Kotlin的扩展函数:扩展Android框架(KAD 08)

    作者:Antonio Leiva 时间:Jan 11, 2017 原文链接:https://antonioleiva.com/extension-functions-kotlin/ 扩展函数是Kotl ...

  4. Andy的生活

    Andy是一个善良的男孩,希望优雅地生活. 现实是残酷的. 现实是,Andy像狗一样活着. Andy犯的错是,错误地认为狗一样的生活将在高考结束的那一刻结束. 大学四年时间根本没有静下心来学习,却在生 ...

  5. ext3学习小结

    先介绍一下ext3和ext4的一些区别吧,初看ext4相对于ext3源码还是有很多不同的,ext4加入的define和create两个强大的类,ext4为了让源码容易看,特意将所有的类进行了defin ...

  6. 【C#】面试题整理

    1.C#中类是否支持多继承?请说明原因.答:不支持,需要用接口来实现多继承 2.我们都知道一个类可以有多个构造函数,并且C#会在我们创建类的时候默认的提供一个无参的构造函数,当我实现了另外一个有参数的 ...

  7. C# 图形普通处理,resize ,水印..

    网站中,对用户图片上传处理是很有必要的.对于一些常用的处理,对图片各种形式的压缩,各种形式的水印. 1.裁剪正方形头像方法 /// <summary> /// 正方型裁剪 /// 以图片中 ...

  8. iOS-延迟操作方法总结

    在实际应用中,有时候我们会需要延时执行某些操作,所以我们这里总结了四种延迟操作的方法,并简要分析了每种方法的异同. NSObject的相关方法 第一种方法是使用NSObject类的performSel ...

  9. 何为PostgreSQL?

    PostgreSQL 是以加州大学伯克利分校计算机系开发的 POSTGRES, Version 4.2 为基础的对象关系型数据库管理系统(ORDBMS).POSTGRES 领先的许多概念只是在非常迟的 ...

  10. 通过Windows常见性能计数器分析服务器性能瓶颈

    转载 http://www.cnblogs./junzhongxu/archive/2011/02/15/1954889.html 监测对象 Ø System(系统) l %Total Process ...