我们发现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
分享到:
相关推荐
Hibernate中cascade与inverse属性详解
在Java的持久化框架Hibernate中,一对多映射(One-to-Many Mapping)是一种常见的关系映射类型,它反映了数据库中...对于学校等教育机构的信息系统,掌握并灵活运用Hibernate一对多映射将极大地提升数据库管理的效率。
在Java持久化框架Hibernate中,一对多映射(One-to-Many Mapping)是数据库关系模型中常见的关联类型,它表示一个实体(如一个用户)可以与多个其他实体(如订单)相关联。在这个实例中,我们将深入探讨如何在...
本文将深入探讨Hibernate中的一对多关系,并重点解析`inverse`属性的作用及其应用。 一对多关系是数据库设计中常见的关联类型,例如一个用户可以拥有多个订单,一个班级可以包含多个学生等。在Hibernate中,通过...
在一对多的关系中,这些特性可以帮助简化数据操作,提高代码的可读性和维护性。下面将详细阐述这两个概念以及如何在实际应用中使用它们。 一、Hibernate级联(Cascade) 级联操作允许我们将对一个实体的更改自动...
以下是对Hibernate一对多映射配置的详解: 一、XML文件配置 1. 单向关联 在这种配置中,关系只在一个方向上定义,例如User类有多个Account。在User的配置文件中,不直接声明与Account的关联,而是在Account的配置...
本主题聚焦于"hibernate单向多对多映射",特别是在XML配置文件中的实现。在这个过程中,我们将探讨多对多关系的原理,以及如何在Hibernate中通过XML配置文件来定义这种关系。 首先,我们需要理解多对多关系的概念。...
在Java的持久化框架Hibernate中,多对多(Many-to-Many)映射是一种常见的关系数据库模型,用于处理两个实体之间复杂的关系。本实例将详细阐述如何在Hibernate中实现多对多映射,并通过源代码和测试程序进行实战演示...
在Hibernate中,`inverse`属性主要用于多对一或一对多的关系中,用于指定哪一方负责维护关系。当两个实体之间存在关联时,如果一方的集合变更,那么另一方的实体可能也需要更新。这时,`inverse`属性就变得尤为重要...
在Java持久化框架Hibernate中,映射集合属性是常见的需求,特别是对于那些具有一对多、多对多关系的实体对象。这里的"List"是Java集合框架中的一个接口,用于存储一组有序的元素,而在Hibernate中,它常用来映射...
本篇主要探讨的是如何在Hibernate中实现一对多的单向关联映射。 一、概念理解 一对多关联意味着一个实体(如部门)可以有多个关联实体(如员工),而反过来,每个员工只属于一个部门。单向关联则表示只有部门知道其...
本文将详细解析"hibernate一对多映射"的概念、配置及其实现过程,以帮助理解并掌握这一核心特性。 首先,我们要明白在关系型数据库中,"一对多"关系意味着一个实体(比如一个部门)可以有多个相关实体(如部门下的...
在Java的持久化框架Hibernate中,一对多关系(OneToMany)是一种常见的对象关系映射(ORM)映射方式,它模拟了数据库中一个表的一条记录与另一表的多条记录之间的关联。本教程通过源代码的形式,讲解如何在Hibernate...
在Java的持久化框架Hibernate中,多对多映射是一种常见的关系映射方式,用于处理两个实体类之间一对多或多对一的关系。在这个例子中,我们看到的是`Team`(团队)与`Member`(成员)之间的多对多关系,通过`Map`数据...
### Hibernate映射一对多关联关系 #### 知识点概览 - **概念解析**:一对多(One-to-Many)关联关系的概念及其在Hibernate中的实现方式。 - **域模型设计**:创建具有一个实体与多个实体关联的域模型。 - **关系...
本案例主要探讨的是Hibernate中的一对多关系映射,这是一种常见的对象关系映射(ORM)配置,用于表示一个实体与多个其他实体之间的关联。 在传统的数据库设计中,一对多关系是指一个表(父表)中的记录可以与另一个...
在Hibernate中,实体间的关系可以是一对一、一对多、多对一或多对多。例如,一个学生可以有多个课程,而一个课程可以被多个学生选修,这就是典型的多对多关系。在表示这种关系时,通常会在两个实体类中都定义一个...
本文将深入探讨Hibernate中的两个重要概念:一对多(One-to-Many)和多对一(Many-to-One)的持久化映射。 ### 一对多映射 **定义**: 一对多映射表示一个实体(如部门)可以关联多个实体(如员工)。在数据库层面...
在上述配置中,`<one-to-many>`标签定义了`User`到`Order`的一对多关系,而`<many-to-one>`标签定义了`Order`到`User`的多对一关系。`inverse="true"`意味着`Order`端负责维护关系,即当删除一个`Order`时,其对应的...