zoukankan      html  css  js  c++  java
  • hibernate inverse=true

    ***

    1,部门与员工是一对多,

    部门或员工任何一方去维护他们的映射关系都可以,在关系表中都可以互相找到,可是在对象关系中,双方都要去维护,

    如emp.setDepart(depart);depart.setEmps(emps);

    这样hibernate会产生重复的更新语句,效率低,为了让对象之间的关系都维护好,而sql语句有没有多余,

    通常让一的那一方不去维护之间的关联关系,就是用inverse=true;

    解释为是否放弃维护关系--是,我的理解是:是否让对方去维护--是,因为inverse是倒转的,相反的意思

    Department.java,

    package com.maple.hibernate.domain;
    
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    
    public class Department {
        private int id;
        private String name;
        private Set<Employee> emps;
        //private Map<String,Employee> emps;
        
        /*private List<Employee> emps;*/
        
        public Set<Employee> getEmps() {
            return emps;
        }
        public void setEmps(Set<Employee> emps) {
            this.emps = emps;
        }
        /*public Map<String, Employee> getEmps() {
            return emps;
        }
        public void setEmps(Map<String, Employee> emps) {
            this.emps = emps;
        }*/
        /*public List<Employee> getEmps() {
            return emps;
        }
        public void setEmps(List<Employee> emps) {
            this.emps = emps;
        }*/
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        
    }

    Employee.java

    package com.maple.hibernate.domain;
    
    public class Employee {
        private int id;
        private String name;
        private Department depart;
        
        public Department getDepart() {
            return depart;
        }
        public void setDepart(Department depart) {
            this.depart = depart;
        }
        @Override
        public String toString() {
            return "Employee [id=" + id + ", name=" + name + "]";
        }
        //private Department depart;
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        /*public Department getDepart() {
            return depart;
        }
        public void setDepart(Department depart) {
            this.depart = depart;
        }*/
        
    }

    Department.hbm.xml

    <?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="com.maple.hibernate.domain">
    
        <class name="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>
            <!-- <list name="emps">
                <key column="depart_id"/>
                <list-index column="order_col"/>
                <one-to-many class="Employee"/>
            </list> -->
            <!-- <bag name="emps">
                <key column="depart_id"/>
                <one-to-many class="Employee"/>
            </bag> -->
            <!-- <map name="emps">
                <key column="depart_id"/>
                <map-key type="string" column="name"/>
                <one-to-many class="Employee"/>
            </map> -->
        </class>
    
    </hibernate-mapping>

    Employee.hbm.xml

    <?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="com.maple.hibernate.domain">
    
        <class name="Employee"> 
            <id name="id">
                <generator class="native" /> 
            </id>
            <property name="name" unique="true"/>
            <many-to-one name="depart" column="depart_id"/>
        </class>
    
    </hibernate-mapping>

    测试

    public class Many2One {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            add();
            queryDepart(1);
            //System.out.println("ff");
            //Employee emp=query(1);
            //System.out.println("ffff  depart name:"+emp.getDepart().getName());
        }

    static Department add(){
            Session s=null;
            Transaction tx=null;
            try{
                s=HibernateUtil.getSession();
                /*List<Employee> emps=new ArrayList<Employee>();*/
                //Map<String,Employee> emps=new HashMap<String,Employee>();
                Set<Employee> emps=new HashSet<Employee>();
                Department depart=new Department();
                depart.setName("software");
                
                Employee emp=new Employee();
                emp.setDepart(depart); //导致更新语句
                emp.setName("aaa");
                
                Employee emp1=new Employee();
                emp1.setDepart(depart);  //导致更新语句
                emp1.setName("aaa1");
               
                /*emps.put(emp1.getName(), emp1);
                emps.put(emp.getName(), emp);  */
                emps.add(emp);
                emps.add(emp1);
                
                depart.setEmps(emps); //导致对employee表中depart_id的更新语句
                
                tx=s.beginTransaction();
                s.save(depart); //如果放下面,employee会多出一条更新语句
                s.save(emp); //如果设置了not-null=true,则出错
                s.save(emp1);
                tx.commit();
                System.out.println(depart.getEmps().getClass());
                //HashSet hs=(HashSet) depart.getEmps();//类转换异常
                
                return depart;
            }finally{
                if(s!=null){
                    s.close();
                }
            }
        }
    static Department queryDepart(int departid){
            Session s=null;
            
            try{
                s=HibernateUtil.getSession();
                Department depart=(Department) s.get(Department.class, departid);
                System.out.println("emps:"+depart.getEmps());
                return depart;
                
            }finally{
                if(s!=null){
                    s.close();
                }
            }
        }

     还有些需要注意:

    不要在有序集合如list,array中使用inverse, 

    <!-- <list name="emps">
    <key column="depart_id"/>
    <list-index column="order_col"/>
    <one-to-many class="Employee"/>
    </list> -->

    你想,他都不去维护他们的映射关系了,又怎会关心他们添加的顺序

    ***

    有问题在公众号【清汤袭人】找我,时常冒出各种傻问题,然一通百通,其乐无穷,一起探讨


  • 相关阅读:
    cocos2d-x C++ 判断当前平台宏定义大全
    cocos2d-x JS 纯代码加载播放plist与png动画
    cocos2d-x JS 加载播放Studio帧动画的两种方法
    iOS开发小技巧总结
    cocos2d-x C++ (Android)集成第三方微信分享
    cocos2d-x C++ (iOS)集成第三方微信分享
    cocos2d-x JS 获取当前系统时间(解决屏幕双击点击事件)
    (已解决) eclipse提示报错"serializing cdt project settings"解决方案
    cocos2dx
    cocos2d-X JS 获取cocostudio中的UI组件
  • 原文地址:https://www.cnblogs.com/qingmaple/p/4116641.html
Copyright © 2011-2022 走看看