【SSH三大框架】Hibernate基础第十篇:inverse属性详解

inverse经常用在双向的1—N关联之中,也可以用在N—N的关联,这里举例子用双向的1—N关联

还是用部门和员工两个,关于两个的javabean不再写。

首先,我们看下员工的映射文件:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping
    package="cn.itcast.hibernate.domain">
    <class name="Employee" table="tb_Employee">
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="name" />
        <many-to-one name="depart" column="depart_id" />
    </class>  

</hibernate-mapping>  

然后,是部门的映射文件:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping
    package="cn.itcast.hibernate.domain">  

    <class name="Department" table="tb_Department">
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="name" />  

        <set name="emps">
        	<key column="depart_id" />
        	<one-to-many class="Employee" />
        </set>
    </class>  

</hibernate-mapping>  

此时,在部门的映射文件的set标签中,我们未用inverse属性,接下来我们写一个测试类看看情况:

package cn.itcast.hibernate;

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

import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.Transaction;

import cn.itcast.hibernate.domain.Department;
import cn.itcast.hibernate.domain.Employee;

public class Many2One {
    public static void main(String[] arg){
        Department depart = add();
    }  

    static Department add(){
        Session s = null;
        Transaction tx = null;
        try{
            Department depart = new Department();
            Department depart1 = new Department();
            depart.setName("depart name");  

            Employee emp1 = new Employee();
            emp1.setDepart(depart); //建立两个对象的关联关系
            emp1.setName("emp name");  

            Employee emp2 = new Employee();
            emp2.setDepart(depart); //建立两个对象的关联关系
            emp2.setName("emp name");  

            Set<Employee> emps = new HashSet<Employee>();

            emps.add(emp1);
            emps.add(emp2);
            depart.setEmps(emps);

            s = HibernateUtil.getSession();
            tx = s.beginTransaction();  

            s.save(depart);
            s.save(emp1);
            s.save(emp2);
            System.out.println(depart.getEmps().size());

            tx.commit();
            return depart;
        }finally{
            if(s!=null){
                s.close();
            }
        }
    }
}  

我们看下程序:首先建立了一个Department对象,并建立了两个Employee对象,并且分别为这两个Employee对象设置depart。然后,我们建立了一个Set集合存放这两个Employee对象,然后把这个集合注入给Department对象depart。现在,在数据库中是一对多,在Hibernate关系中,部门可以知道有哪些员工,员工知道属于哪个部门。

我们看一下MyEclipse打印出来的sql语句:

Hibernate: insert into tb_Department (name) values (?)
Hibernate: insert into tb_Employee (name, depart_id) values (?, ?)
Hibernate: insert into tb_Employee (name, depart_id) values (?, ?)
2
Hibernate: update tb_Employee set depart_id=? where id=?
Hibernate: update tb_Employee set depart_id=? where id=?

我们看到,第一、二、三行是三条插入语句,分别插入1个Department和2个Employee,在第四行打印出来了Department对象拥有的员工的size()个数。但是在最下边两行出现了两条update语句,这两条update语句是我们在代码中把set集合注入给Department对象depart:

当双向1—N关联的时候,1的一端想要维护关系,N的一端也想要维护关系,在1的一端先插入,N的一端后插入之后,还要为N的一端外键再更新成为1的一端的id。所以会多出两条update语句。

但是,如果我们在部门映射文件中的set标签加入inverse="true"的属性后,这两条update语句就会消失,我们修改下部门映射文件:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping
    package="cn.itcast.hibernate.domain">  

    <class name="Department" table="tb_Department">
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="name" />  

        <set name="emps" inverse="true" >
        	<key column="depart_id" />
        	<one-to-many class="Employee" />
        </set>
    </class>  

</hibernate-mapping>  

我们再测试一下会打印出哪些sql语句:

Hibernate: insert into tb_Department (name) values (?)
Hibernate: insert into tb_Employee (name, depart_id) values (?, ?)
Hibernate: insert into tb_Employee (name, depart_id) values (?, ?)
2

这里的两条update语句已经是不见了。

这是因为1的一端不再控制关联关系。

inverse=“true”表明1的一端不再控制关联关系

时间: 2024-08-26 00:52:30

【SSH三大框架】Hibernate基础第十篇:inverse属性详解的相关文章

hibernate中inverse属性详解

术语"inverse"直译为"反转".在Hibernate中,inverse属性指定了关联关系中的方向.关联关系中,inverse="false"的为主动方,由主动方维护关联关系.在一对多关联中,将one方的inverse设置为true,这将有助于性能的改善.也就是让所有新生主动来报到.Hibernate: insert into district (name, id) values (?, ?)Hibernate: insert into st

Vue 2.0 深入源码分析(五) 基础篇 methods属性详解

用法 methods中定义了Vue实例的方法,官网是这样介绍的: 例如:: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <script src="https://cdn.bootcss.com/vue/2.5.16/vue.js"></script> <title>Document&

Vue 2.0 深入源码分析(六) 基础篇 computed 属性详解

用法 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护,比如: <div id="example">{{ message.split('').reverse().join('') }}</div> <script> var app = new Vue({ el:'#example', data:{message:'hello world'} }) </script> 这样模板不再是简

hibernate(六) cascade(级联)和inverse关系详解

序言 写这篇文章之前,自己也查了很多的资料来搞清楚这两者的关系和各自所做的事情,但是百度一搜,大多数博文感觉说的云里雾里,可能博主自己清楚是怎么一回事,但是给一个不懂的人或者一知半解的人看的话,别人也看不懂其中的关系,所以我自己写博文的时候,会尽量用通俗通俗在通俗的语言去描述一个概念,希望能尽自己的力量去帮助你们理解.光看我的是不行的,最关键的是要自己动手去实践一遍,能得出一样的结论,那就说明懂了,在我不懂的时候,我就去自己实现它,一次次尝试,慢慢的就总结出规律了. --WH 一.外键 我为什么

【SSH三大框架】Hibernate基础第十二篇:load()懒加载分析以及一对一、一对多、多对一、多对多懒加载的分析

一.懒加载的定义: 懒加载:在WEB应用程序中,经常会需要查询数据库,系统的响应速度在很大程度上是与数据库交互的响应.因此,如果能够优化与数据库的交互速度,则能够大大提高WEB应用的响应速度. 例如:当有一个Student类和一个Teacher类.当我们加载一个学生的所有信息,包括:学号,姓名等属性后,此时Student类中的Teacher类型的属性为null,当我们需要知道这个Student对应的Teacher属性的时候,我们才去加载这个Teacher对象. 如果,我们只需要知道学生信息,我们

eclipse中SSH三大框架环境搭建&lt;三&gt;

相关链接: eclipse中SSH三大框架环境搭建<一> eclipse中SSH三大框架环境搭建<二> 引言:通过上两篇文章我们已经可以掌握struts2和spring的环境的搭建以及简单使用,但是在访问数据库层面使用的是传统的JDBC.在我们项目开发中使用JDBC确实是不太理想的,所以今天我给大家来讲解一下目前行业中比较流行的持久层框架——hibernate. 第1步:我们依旧需要引入hibernate的jar包 找到hibernate解压好的文件目录,在该目录下的lib目录下有

SSH三大框架的整合

SSH三个框架的知识点 一.Hibernate框架 1. Hibernate的核心配置文件 1.1 数据库信息.连接池配置 1.2 Hibernate信息 1.3 映射配置 1.4 Hibernate核心配置文件 如果单纯使用Hibernate框架,核心配置文件名称hibernate.cfg.xml并且一定要放在src下面,而hibernate和spring整合的时候,hibernate核心配置文件名称和位置没有固定要求的(因为到时候会有一个参数指定其位置). 2. Hibernate映射配置文

SSH三大框架注解整合(二)

5.使用spring注解注入service,DAO action: @ParentPackage(value = "struts-default") @Namespace("/") @Controller @Scope("prototype") public class BookAction extends ActionSupport implements ModelDriven<Book>{ //模型驱动 public Book b

java ssh三大框架搭建整合

今天开个坑java ssh三大框架搭建整合(注解+XML 用全注解不是很好,有点地方需要用模板的时候XML直接可以复制一段) 1 所用框架.技术 编号 工具 版本 说明 Struts 2 2.3.20 Hibernate 4.3.9 实现持久化操作 Spring 4.1.5 Junit 4 单元测试 2.  开发环境 操作系统 Windows 7 开发工具 Eclipse Java EE 数据库 Oracle 11g Web容器 Tomcat 7.0.63 JAVA JDK 1.7 建立proj