zoukankan      html  css  js  c++  java
  • 【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该协会的最终不再控制


    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    鸟哥的linux私房菜学习-(八)Linux 文件与目录管理
    我的作品
    聊聊软件测试面试的一些事
    如何做一名专业的软件测试工程师
    测试Leader应该做哪些事
    软件测试工程师的岗位职责
    一个完整的性能测试流程
    做接口测试需要哪些技能
    软件质量保障体系建设
    性能测试常见瓶颈分析及调优方法
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4735009.html
Copyright © 2011-2022 走看看