`
Wind_ZhongGang
  • 浏览: 264724 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Hibernate inverse 深度解析

阅读更多

  inverse 英文意思为反向,倒转的。

 

  Hibernate配置文件中的inverse正是这一意思的真实反映,inverse属性只在Hibernate配置文件的集合元素上存在,如bag,list,map,set等。inverse有两个值,分别为true和false,如果inverse=false,表明控制权在一对多关联关系的一方;如果inverse=true,表明控制权在一对多关联关系的多方。

 

  下面以公司与分公司为例来说明inverse的作用。一个公司有多个分支,一个分支又只属于一个公司。

 

  一。Company.java

 

package com.template.model.company;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by IntelliJ IDEA.
 * User: Zhong Gang
 * Date: 11-8-9
 * Time: 下午9:02
 */
public class Company {
    private Integer id;
    private String name;

    private List<Branch> branches;

    public Company() {
    }
    
    public Company(String name) {
        this.name = name;
    }

    public void addBranch(Branch branch) {
        if (branches == null) {
            branches = new ArrayList<Branch>();
        }
        branches.add(branch);
    }
}

 

  二。Company.hbm.xml

 

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping default-access="field">

    <class name="com.template.model.company.Company" table="company" dynamic-insert="true" dynamic-update="true">
        <id name="id" column="id" type="java.lang.Integer">
            <generator class="native"/>
        </id>
        <property name="name" column="name" type="java.lang.String"/>

        <bag name="branches" table="branch" inverse="false" cascade="all">
            <key column="companyid"/>
            <one-to-many class="com.template.model.company.Branch"/>
        </bag>
    </class>

</hibernate-mapping>

 

  三。Branch.java

 

package com.template.model.company;

/**
 * Created by IntelliJ IDEA.
 * User: Zhong Gang
 * Date: 11-8-9
 * Time: 下午9:02
 */
public class Branch {
    private Integer id;
    private String name;

    private Company company;

    public Branch() {
    }

    public Branch(String name) {
        this.name = name;
    }

    public Branch(String name, Company company) {
        this.name = name;
        this.company = company;
    }
}

 

  四。Branch.hbm.xml

 

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping default-access="field">

    <class name="com.template.model.company.Branch" table="branch" dynamic-insert="true" dynamic-update="true">
        <id name="id" column="id" type="java.lang.Integer">
            <generator class="native"/>
        </id>
        <property name="name" column="name" type="java.lang.String"/>

        <many-to-one name="company" class="com.template.model.company.Company" column="companyid"/>
    </class>

</hibernate-mapping>

 

  五。测试类HibernateInverseTest.java

 

import com.template.model.company.Branch;
import com.template.model.company.Company;
import junit.framework.TestCase;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;

import java.util.Properties;

/**
 * Created by IntelliJ IDEA.
 * User: Zhong Gang
 * Date: 11-8-8
 * Time: 下午10:03
 */
public class HibernateInverseTest extends TestCase {
    private SessionFactory sessionFactory = null;

    @Override
    public void setUp() throws Exception {
        Properties properties = new Properties();
        properties.setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");
        properties.setProperty("hibernate.connection.url", "jdbc:mysql://localhost:3306/demo");
        properties.setProperty("hibernate.connection.username", "root");
        properties.setProperty("hibernate.connection.password", "root");
        properties.setProperty("hibernate.show_sql", "true");
        properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
        properties.setProperty("hibernate.hbm2ddl.auto", "update");

        Configuration configuration = new Configuration();
        configuration.addResource("hibernate_mappings/Company.hbm.xml");
        configuration.addResource("hibernate_mappings/Branch.hbm.xml");
        configuration.setProperties(properties);
        sessionFactory = configuration.buildSessionFactory();
    }

    public void testInverse() throws Exception {
        Session session = sessionFactory.openSession();

        Company company = new Company("company");

        Branch branch1 = new Branch("branch one", company);
        Branch branch2 = new Branch("branch two", company);

        company.addBranch(branch1);
        company.addBranch(branch2);

        Transaction transaction = session.getTransaction();
        transaction.begin();

        session.saveOrUpdate(company);

        transaction.commit();
    }
}

 

  注意:在Company的持久化配置文件Company.hbm.xml中,bag元素的inverse属性为false

 

  六。inverse=false时,测试运行结果

  inverse_false

 

  七。将Company.hbm.xml配置文件中的inverse值改为true。inverse=true时,测试运行结果

  inverse_true

 

  从上面两张截图上发现,当inverse=false时,也就是说控制权在Company对象上时,Hibernate多操作了两条update语句。关于inverse的true和false的值的区别。可以这样来理解,当inverse=false时,Hibernate首先会逐条插入company,branch1,branch2,这个时候Hibernate并不会维护Company与Branch之间的一对多的关联关系,也就是说当插入branch1,branch2时,companyid的值是null,然后Hibernate会再多发出两条update语句,用于建立Company与Branch之间的一对多的关联关系。而当inverse=false时,Hibernate就只需要操作三条语句就可以建立起Company与Branch之间的一对多的关联关系,因为插入branch1和branch2的时候也为它们赋予了companyid的值。所以可以看出inverse为true或false,达到的结果一样,实现的过程却截然不同。出于执行效率的考虑,建议将inverse设置为true,即由多方来维护一对多的关联关系。

 

 

  • 大小: 7.4 KB
  • 大小: 4.6 KB
1
7
分享到:
评论

相关推荐

    彻底明白Hibernate中的Inverse

    在Hibernate中,`Inverse`是一个重要的概念,它涉及到实体之间的关联管理。本文将深入探讨`Inverse`属性,以及它在Hibernate中的作用和应用场景。 一、Hibernate与对象关系映射 Hibernate通过ORM机制将Java对象与...

    hibernate inverse 个人总结.doc

    在探讨Hibernate的`inverse`属性之前,我们先要理解Hibernate中的对象关系映射(ORM)以及持久化机制。Hibernate是一个流行的Java ORM框架,它允许开发者将数据库操作转换为面向对象的编程模型,使得数据操作更加...

    hibernate inverse和cascade的详细讲解

    ### Hibernate Inverse 和 Cascade 的详细讲解 #### 一、引言 在ORM(Object-Relational Mapping)领域,Hibernate作为一款流行的Java持久层框架,它提供了丰富的API和配置选项来帮助开发者实现对象与数据库表之间...

    JavaEE学习笔记之Hibernate表关系之一对多(inverse详解)

    本文将深入探讨Hibernate中的一对多关系,并重点解析`inverse`属性的作用及其应用。 一对多关系是数据库设计中常见的关联类型,例如一个用户可以拥有多个订单,一个班级可以包含多个学生等。在Hibernate中,通过...

    Hibernate中cascade与inverse属性详解

    Hibernate中cascade与inverse属性详解

    Hibernate中Inverse和Cascade的区别.html

    Hibernate中Inverse和Cascade的区别.html

    Hibernate中cascade和inverse应用

    在 Hibernate 框架中,`cascade` 和 `inverse` 是两个重要的概念,它们主要用于管理对象之间的持久化关系,特别是涉及到一对一(one-to-one)、一对多(one-to-many)和多对多(many-to-many)关系时。这两个属性都...

    hibernate常用注解

    #### 六、示例代码解析 ```java @Entity @Table(name="tbl_sky", uniqueConstraints={@UniqueConstraint(columnNames={"month","day"})}) public class Flight implements Serializable { @Id private Long id; ...

    hibernate 级联(cascade和inverse)一对多

    在Java的持久化框架Hibernate中,级联操作(Cascade)和反转(Inverse)是两个重要的概念,它们主要用于管理对象关系模型中的关联关系。在一对多的关系中,这些特性可以帮助简化数据操作,提高代码的可读性和维护性...

    hibernate集合映射inverse和cascade详解.txt

    在深入探讨Hibernate集合映射中的`inverse`与`cascade`属性之前,我们首先需要理解Hibernate框架的基本概念。Hibernate是一个开放源代码的对象关系映射(ORM)框架,它为Java应用程序提供了一种将对象模型与数据库...

    Hibernate_级联关系说明_-_关于cascade和inverse的用法

    在探讨Hibernate框架中的级联操作(cascade)与控制权反转(inverse)之前,我们需要先对Hibernate有一个基本的理解。Hibernate是一个开放源代码的对象关系映射(ORM)框架,它为Java应用提供了一种将对象模型映射到...

    inverse=true的总结

    本文将深入解析“inverse=true”的含义,以及它在实际应用中的作用。 `inverse`属性是Hibernate框架中的一个关键设置,它用于控制一对多(One-to-Many)或一对一(One-to-One)关联关系的维护责任。在Hibernate中,...

    Hibernate 简单 PPT 总结

    在Hibernate中,`inverse`属性是一个关键的概念,它用于定义一对多或多对一关系中的维护端。`inverse="true"`表示另一端负责维护关联关系,这在处理关联实体的保存和更新时具有重要意义。例如,如果你有一个学生类和...

    Hibernate学习笔记和资料

    hibernate中一对一,一对多,多对多关系的配置,延迟加载,cascade,inverse hibernate查询方式概述,HQL查询,QBC查询,分页,结果集封装方式 ,高级查询 查询的优化,一级缓存,二级缓存,批量查询,注解方式

    inverse 例子

    在Hibernate这个强大的对象关系映射(ORM)框架中,`inverse`属性是一个非常重要的概念,它主要用于管理关联关系的维护责任。在这个例子中,我们将会深入理解`inverse`属性的作用,并通过一个简单的测试案例——`...

    Hibernate电子书(全)

    ### Hibernate电子书(全)- 关键知识点解析 #### Hibernate简介 Hibernate是一种“对象/关系映射”(Object/Relational Mapping,简称ORM)技术,它解决了Java对象模型与关系数据库模型之间的不匹配问题。传统的...

Global site tag (gtag.js) - Google Analytics