inverse
的作用:询问是否放弃维护关系,默认是false
,即不放弃维护关系,即要维护关系。下面借助前面的“一对多”实例来详谈“维护关系问题”。
static
void
add() {
Session s =
null
;
Transaction tx =
null
;
try
{
Department depart =
new
Department();
depart.setName(
"departName"
);
Employee emp1 =
new
Employee();
emp1.setName(
"empName1"
);
emp1.setDepart(depart);
//
员工维护它们之间的关系
Employee emp2 =
new
Employee();
emp2.setName(
"empName2"
);
emp2.setDepart(depart);
Set<Employee> emps =
new
HashSet<Employee>();
emps.add(emp1);
emps.add(emp2);
//
员工维护它们之间的关系
depart.setEmps(emps);
//
部门维护它们之间的关系
s = HibernateUtil.getSession
();
tx = s.beginTransaction();
s.save(emp2);
s.save(emp1);
s.save(depart);
//
以上的代码的书写顺序分两种情况讨论
tx.commit();
}
finally
{
if
(s !=
null
)
s.close();
}
}
下面借助上面的代码来进行分析:一种情况下是员工维护它们之间的关系。其中的关键代码为已在上面说明(即
emp1.setDepart(depart)
,
emp2.setDepart(depart)
):此时,我们再注释掉部门维护关系的代码(即注释掉
depart.setEmps(emps);
),然后执行;执行后再交换
s.save(emp2); s.save(emp1);s.save(depart);
的保存顺序,再执行。
第二种情况是,部门维护它们之间的关系,需注释掉员工维护关系,再分保存的顺序讨论。
第三种情况是,共同维护它们之间的关系。
下面再列表说明:
|
先保存员工,再保存部门
|
先保存部门,再保存员工
|
员工维护关系
|
由于是员工维护关系,当我们先保存员工再保存部门时,会自动把部门信息更新到员工表中,这时会有两条更新操作。
|
由于先保存了部门信息,然后再来保存员工时,便能获知部门信息,所以只进行了插入操作,不会有任何更新操作。
|
部门维护关系
|
由于是部门来维护关系,不论怎样的保存顺序,最终都会有两条更新操作。原因是我们要更新的是员工表,当我们最终保存好部门和员工后,都会再把部门信息更新到员工表中。
|
共同维护关系
|
4
条更新操作,结合上面分析
|
2
条更新操作,结合上面分析。
|
分析了上面的维护关系情况,下面再来讨论由谁来维护关系
:举例,在“一对多”中,如果让“一”来维护关系,相对就低效,如果让“多”来维护关系,则会在效率上有很大的提高。再据此举个生活中的例子,一个老师会有多个学生,如果让老师来维护关系,让老师来记住学生,这将会很难,但如果我们让学生来维护关系,即让每个学生来记住老师,这样将会使效率上有很大的提高,所以通常在关联关系中,我们总是会让“多”这方来维护关系,而让“一”这方放弃维护关系。因此我们需要在“一”的一方配置“inverse
”属性,让它来放弃维护关系。为什么要一方放弃维护关系?在上面的例子中,我们在讨论让双方共同维护关系时,会发现有重复的操作,这就是为什么要提出放弃维护关系的原因,在前面的“多对多”实例中,如果让双方都来维护关系将会报错,原因很简单:“多对多”采取的中间表关联,而双方维护关系,将会试图在中间表插入重复的记录,当然是不可行的,至于在“一对多”等关联关系中可以双方维护关系是因为它采取的是更新外键操作。
总结
:在“一对多”中,维护关系表现为更新外键,而“多对多”,维护关系表现为在“中间表”中增减记录。
下面我们修改Department.hbm.xml
文件,在<set>
元素下增加“
inverse
=
"true"
”属性后,再来执行“
OneToManyTest
”,可以明显感受到“一”放弃了维护关系。
注意
:inverse
只出现在集合类型的标签中,但不能在list
等有序集合中进行配置。
分享到:
相关推荐
- `inverse`属性用于指定在关联关系中哪一方负责维护关联关系的完整性。 - 如果一方设置为`inverse=true`,则当进行添加或删除操作时,由另一方负责维护关系表的完整性。 #### 四、进阶关联映射 **2.5 进阶关联...
- **Inverse和Cascade**:Inverse属性指定关联的哪一方负责维护关系;Cascade属性允许在操作实体时自动触发其他操作。 - **延迟加载**:一种优化策略,只有当真正需要时才加载关联的对象。 #### 九、事务管理 - **...
### hibernate入门知识点详解 #### 一、Hibernate简介与应用场景 **Hibernate** 是一款开源的对象关系映射(ORM)框架,它提供了强大的解决方案,用于处理Java应用中的数据持久化问题。对于初学者来说,理解...
在Hibernate中,`inverse`属性是一个关键的概念,它用于定义一对多或多对一关系中的维护端。`inverse="true"`表示另一端负责维护关联关系,这在处理关联实体的保存和更新时具有重要意义。例如,如果你有一个学生类和...
- 本篇概述了Hibernate入门所需了解的关键知识点,从环境搭建到核心概念再到实际应用场景均有涉及。学习Hibernate不仅可以提升开发效率,还能帮助开发者更好地理解ORM框架的工作原理和技术优势。通过上述内容的学习...
- **Inverse和Cascade**:用于控制关联关系中对象的级联操作。 - **延迟加载(LazyLoading)**:这是一种优化策略,只有在真正需要的时候才加载关联对象的数据,以减少内存占用和提高性能。 #### 八、事务管理 - **...
这里的`<set>`标签表示一个集合,`name`属性指定了Java对象中的集合属性名,`table`是数据库中的表名,`inverse="true"`表示维护关系的责任在多方,`one-to-many`标签则定义了与多方类的关联。 2. Java类的实体...
- 明确如何配置关联的属性,如mappedBy、inverse、fetch等,理解它们在关系维护中的作用。 9. **延迟加载和立即加载**: - 延迟加载:默认行为,只有在真正使用到关联对象时才去数据库加载,节省资源。 - 立即...
它通过使用描述对象和数据库之间映射的元数据,将应用程序的数据对象自动持久化到关系型数据库中。这种框架的主要优势在于它极大地简化了数据访问层的开发工作,让开发者可以更加专注于业务逻辑而不是底层的数据库...
本书不仅涵盖了Hibernate的基础知识,还提供了许多实战经验和技巧,特别适合那些希望在Java应用程序中实现高效对象关系映射(ORM)的开发者阅读。 #### 二、准备工作 在开始学习Hibernate之前,首先要做好一些准备...
- **inverse**:反转控制,用于指定关联关系的维护方。 - **LazyLoading**:延迟加载,只有当真正需要时才加载关联对象。 ##### 4.6 一对一表关联操作 - 通过主键关联或外键关联实现两个表之间的关联。 - 使用`@...
- **Inverse**:在关联关系中指定一方为反向方,用于管理关联关系的变化。 - **LazyLoading**:延迟加载策略,只有在真正需要时才加载数据。 **4.6 表关联操作** Hibernate支持多种表关联操作,如一对一、一对多和...
- **`inverse`属性**:用来决定是由哪一方来维护关联关系。通常,将数量较少的一方设为主动方,数量较多的一方设为被动方,以提高性能。 - **`cascade`属性**:用于指定在进行某种操作时,是否对关联的实体也执行...
在Hibernate中,这种关系可以通过添加中间表(也称为关联表或第三方表)来实现。中间表通常包含两个外键,分别引用两个原始表的主键。 **二、数据库表的创建** 在数据库层面,你需要创建三个表:员工表(Employee...