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();
            }
        }
    }

***

时间: 2024-08-21 12:19:34

hibernate inverse=true的相关文章

【Hibernate】详解Hibernate中的inverse=”true”

首先两个类,一个是班级类,一个是学生类: public class Grade{ private int id; private String name; private Set students = new HashSet(); } public class Student { private int id; private String studentName; } 数据库中表的结构: t_grade: 两个字段:id  name t_student: 三个字段:id  studentNam

Hibernate中inverse=&quot;true&quot;的理解

Hibernate中inverse="true"的理解 Customer类: Java代码 1. public class Customer { 2. private int id; 3. private String name; 4. private Set orders = new HashSet(); 5. ??? 6. } 即Customer类具有一个set集合属性orders,其中Order是一个普通的类: Java代码 1. public class Order { 2.

Hibernate inverse 和 cascade 的阐释

前提: inverse:负责外键维护; cascade:负责记录的添加删除修改;基础: Hibernate中的"inverse"属性只有两个值"true"和"false"."true"表示将关系维护的权力交给对方,"false"表示不交出维护权力(默认值). Hibernate中的"cascade"-书面化的解释为"该属性会使我们在操作主对象时,同时Hibernate帮助我们完

Hibernate inverse用法(转载)

出处:http://blog.csdn.net/xiaoxian8023/article/details/15380529 一.Inverse是hibernate双向关系中的基本概念.inverse的真正作用就是指定由哪一方来维护之间的关联关系.当一方中指定了“inverse=false”(默认),那么那一方就有责任负责之间的关联关系,说白了就是hibernate如何生成Sql来维护关联的记录! Hibernate仅仅按照主控方对象的状态的变化来同步更新数据库.按照原来的映射文件,people.

Hibernate inverse属性和cascade属性

Inverse属性 Inverse属性,是在维护关联关系的时候起作用的. 表示控制权是否转移.(在一的一方起作用) Inverse , 控制反转. Inverse = false  不反转:   当前方有控制权 True  控制反转: 当前方没有控制权 维护关联关系中,是否设置inverse属性: 1.保存数据                    有影响. 如果设置控制反转,即inverse=true, 然后通过部门方维护关联关系.在保存部门的时候,同时保存员工,数据会保存,但关联关系不会维护

hibernate:inverse、cascade,一对多、多对多详解

1.到底在哪用cascade="..."? cascade属性并不是多对多关系一定要用的,有了它只是让我们在插入或删除对像时更方便一些,只要在cascade的源头上插入或是删除,所有cascade的关系就会被自动的插入或是删除.为了能正确的cascade,unsaved-value是个很重要的属性.Hibernate通过这个属性来判断一个对象应该save还是update,如果这个对象的id是unsaved-value的话,那说明这个对象不是persistence object,要sav

hibernate -inverse

one to many inverse=false只能设置维护关联关系的多的一方, inverse属性: 默认为false,表示本方维护关联关系. 如果为true,表示本方不维护关联关系(并不意味着对方维护). 只是影响是否能设置外键列的值(设成有效值或是null值),对获取信息没有影响. A, 解除关联关系 从员工方解除  可以直接解除 // 从部门方解除(与inverse有关系,为false时可以解除) B. 删除 删除员工方(多方),对对方没有影响 // 删除部门方(一方) // a, 如

hibernate inverse属性的作用

hibernate配置文件中有这么一个属性inverse,它是用来指定关联的控制方的. inverse属性默认是false,若为false,则关联由自己控制,若为true,则关联 由对方控制. 见例子: 一个Parent有多个Child,一个Child只能有一个Parent. package com.xian; public class Child { private Long id; private String name; private Parent parent; public Long

hibernate inverse作用

Inverse是hibernate双向关系中的基本概念.inverse的真正作用就是指 定由哪一方来维护之间的关联关系.当一方中指定了"inverse=false"(默认),那么那一方就有责任负责之间的关联关系,说白了就是 hibernate如何生成Sql来维护关联的记录! 如果把Inverse设置为false,会多打印一条SQL语句 如果把Inverse配置改为true则结果之打印2条语句 一对多中,如果要一方维护关 系,就会使在插入或是删除"一"方时去updat