`

hibernate一对多映射的inverse属性的智能性困惑

阅读更多

    我们发现sql语句的个数是相同的,功能也差不多,但发现上面在两个update语句里面,又把name设置了一下,但底下的sql语句则显示的比较“智能”一些,不知道为什么,恳请高手解释。


[/size]
    public class Address {
	private long id;
	
	private String name;
	
	private Person person;
       //..........

<hibernate-mapping>
	<class name="com.learning.model.Address" table="t_address">
		<id name="id">
			<generator class="native" />
		</id>
		<property name="name" />
                <!--这里做多对一映射,Address有一个属性person,t_adddress表中-->
                <--有一个属性叫person_id-->
		<many-to-one name="person" column="person_id" />
	</class>
</hibernate-mapping>

public class Person {
	private long id;
	
	private String name;
	
	private Set<Address> addresses;

<hibernate-mapping>
	<class name="com.learning.model.Person" table="t_person">
		<id name="id">
			<generator class="native" />
		</id>
		
		<property name="name" />
                <!-- 这里做一对多映射,addresses是Person的一个属性-->
		<set name="addresses" inverse="false">
                        <!--通过t_address的person_id字段来关联-->
			<key column="person_id" />
                        <!--addresses里面存储的是entity的实体-->
			<one-to-many class="com.learning.model.Address"/>
		</set>
	</class>
</hibernate-mapping>

假设我们person里面many-to-one的inverse属性设置成true,现在我们运行测试代码:
Session session = HibernateUtil.sessionFactory.getCurrentSession();
		
		Address addressOne = new Address();
		Address addressTwo = new Address();
		
		addressOne.setName("one");
		addressTwo.setName("two");
		
		Person person = new Person();
		person.setName("person");
		
		
		Set<Address> addresses = new HashSet<Address>();
		addresses.add(addressOne);
		addresses.add(addressTwo);
		
		//person.setAddresses(addresses);
		
		session.beginTransaction();
		session.save(addressOne);
		session.save(addressTwo);
		session.save(person);
		
		session.getTransaction().commit();


产生的SQL:

--------------------------------------------
    insert 
    into
        t_address
        (name, person_id) 
    values
        (?, ?)
--------------------------------------------
    insert 
    into
        t_address
        (name, person_id) 
    values
        (?, ?)
--------------------------------------------
    insert 
    into
        t_person
        (name) 
    values
        (?)
--------------------------------------------

感觉现在hibernate并没有帮我们自动的设置address的外键。

现在我们看到,若果要程序正确,我们则需要手动的设置address的person属性:
加上下面的代码:

addressOne.setPerson(person);
addressTwo.setPerson(person);


产生的SQL:

--------------------------------------------
    insert 
    into
        t_address
        (name, person_id) 
    values
        (?, ?)
--------------------------------------------
    insert 
    into
        t_address
        (name, person_id) 
    values
        (?, ?)
--------------------------------------------
    insert 
    into
        t_person
        (name) 
    values
        (?)
-------------------------------------------- 
    update
        t_address 
    set
        name=?,
        person_id=? 
    where
        id=?
--------------------------------------------
    update
        t_address 
    set
        name=?,
        person_id=? 
    where
        id=?
--------------------------------------------

假设我们person里面many-to-one的inverse属性设置成false,现在我们运行测试代码:
[size=large]
并注释掉上面的那两行代码:
addressOne.setPerson(person);
addressTwo.setPerson(person);


运行产生的SQL:
[/size]
--------------------------------------------
    insert 
    into
        t_address
        (name, person_id) 
    values
        (?, ?)
--------------------------------------------
    insert 
    into
        t_address
        (name, person_id) 
    values
        (?, ?)
--------------------------------------------
    insert 
    into
        t_person
        (name) 
    values
        (?)
--------------------------------------------
    update
        t_address 
    set
        person_id=? 
    where
        id=?
-------------------------------------------- 
    update
        t_address 
    set
        person_id=? 
    where
        id=?
--------------------------------------------


  • 大小: 8.8 KB
  • 大小: 175.6 KB
0
0
分享到:
评论

相关推荐

    Hibernate中cascade与inverse属性详解

    Hibernate中cascade与inverse属性详解

    Hibernate一对多映射

    在Java的持久化框架Hibernate中,一对多映射(One-to-Many Mapping)是一种常见的关系映射类型,它反映了数据库中...对于学校等教育机构的信息系统,掌握并灵活运用Hibernate一对多映射将极大地提升数据库管理的效率。

    hibernate一对多映射

    在Java持久化框架Hibernate中,一对多映射(One-to-Many Mapping)是数据库关系模型中常见的关联类型,它表示一个实体(如一个用户)可以与多个其他实体(如订单)相关联。在这个实例中,我们将深入探讨如何在...

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

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

    hibernate 级联(cascade和inverse)一对多

    在一对多的关系中,这些特性可以帮助简化数据操作,提高代码的可读性和维护性。下面将详细阐述这两个概念以及如何在实际应用中使用它们。 一、Hibernate级联(Cascade) 级联操作允许我们将对一个实体的更改自动...

    Hibernate一对多映射配置详解

    以下是对Hibernate一对多映射配置的详解: 一、XML文件配置 1. 单向关联 在这种配置中,关系只在一个方向上定义,例如User类有多个Account。在User的配置文件中,不直接声明与Account的关联,而是在Account的配置...

    hibernate单向多对多映射(XML版)

    本主题聚焦于"hibernate单向多对多映射",特别是在XML配置文件中的实现。在这个过程中,我们将探讨多对多关系的原理,以及如何在Hibernate中通过XML配置文件来定义这种关系。 首先,我们需要理解多对多关系的概念。...

    Hibernate多对多映射

    在Java的持久化框架Hibernate中,多对多(Many-to-Many)映射是一种常见的关系数据库模型,用于处理两个实体之间复杂的关系。本实例将详细阐述如何在Hibernate中实现多对多映射,并通过源代码和测试程序进行实战演示...

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

    在Hibernate中,`inverse`属性主要用于多对一或一对多的关系中,用于指定哪一方负责维护关系。当两个实体之间存在关联时,如果一方的集合变更,那么另一方的实体可能也需要更新。这时,`inverse`属性就变得尤为重要...

    Hibernate映射集合属性List

    在Java持久化框架Hibernate中,映射集合属性是常见的需求,特别是对于那些具有一对多、多对多关系的实体对象。这里的"List"是Java集合框架中的一个接口,用于存储一组有序的元素,而在Hibernate中,它常用来映射...

    Hibernate一对多单向关联映射

    本篇主要探讨的是如何在Hibernate中实现一对多的单向关联映射。 一、概念理解 一对多关联意味着一个实体(如部门)可以有多个关联实体(如员工),而反过来,每个员工只属于一个部门。单向关联则表示只有部门知道其...

    hibernate一对多代码

    本文将详细解析"hibernate一对多映射"的概念、配置及其实现过程,以帮助理解并掌握这一核心特性。 首先,我们要明白在关系型数据库中,"一对多"关系意味着一个实体(比如一个部门)可以有多个相关实体(如部门下的...

    Hibernate一对多主键关联映射源代码

    在Java的持久化框架Hibernate中,一对多关系(OneToMany)是一种常见的对象关系映射(ORM)映射方式,它模拟了数据库中一个表的一条记录与另一表的多条记录之间的关联。本教程通过源代码的形式,讲解如何在Hibernate...

    Hibernate使用 Map实现多对多映射

    在Java的持久化框架Hibernate中,多对多映射是一种常见的关系映射方式,用于处理两个实体类之间一对多或多对一的关系。在这个例子中,我们看到的是`Team`(团队)与`Member`(成员)之间的多对多关系,通过`Map`数据...

    Hibernate映射一对多关联关系

    ### Hibernate映射一对多关联关系 #### 知识点概览 - **概念解析**:一对多(One-to-Many)关联关系的概念及其在Hibernate中的实现方式。 - **域模型设计**:创建具有一个实体与多个实体关联的域模型。 - **关系...

    hibernate一对多案例

    本案例主要探讨的是Hibernate中的一对多关系映射,这是一种常见的对象关系映射(ORM)配置,用于表示一个实体与多个其他实体之间的关联。 在传统的数据库设计中,一对多关系是指一个表(父表)中的记录可以与另一个...

    彻底明白Hibernate中的Inverse

    在Hibernate中,实体间的关系可以是一对一、一对多、多对一或多对多。例如,一个学生可以有多个课程,而一个课程可以被多个学生选修,这就是典型的多对多关系。在表示这种关系时,通常会在两个实体类中都定义一个...

    Hibernate持久化映射一对多和多对一

    本文将深入探讨Hibernate中的两个重要概念:一对多(One-to-Many)和多对一(Many-to-One)的持久化映射。 ### 一对多映射 **定义**: 一对多映射表示一个实体(如部门)可以关联多个实体(如员工)。在数据库层面...

    hibernate双向一对多关联映射(XML)

    在上述配置中,`&lt;one-to-many&gt;`标签定义了`User`到`Order`的一对多关系,而`&lt;many-to-one&gt;`标签定义了`Order`到`User`的多对一关系。`inverse="true"`意味着`Order`端负责维护关系,即当删除一个`Order`时,其对应的...

Global site tag (gtag.js) - Google Analytics