`
neeleon
  • 浏览: 183483 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

hibernate入门(九)关联关系中的高级应用_inverse属性

阅读更多

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 等有序集合中进行配置。

分享到:
评论

相关推荐

    Hibernate入门

    - `inverse`属性用于指定在关联关系中哪一方负责维护关联关系的完整性。 - 如果一方设置为`inverse=true`,则当进行添加或删除操作时,由另一方负责维护关系表的完整性。 #### 四、进阶关联映射 **2.5 进阶关联...

    hibernate入门级教程,零基础哟

    - **Inverse和Cascade**:Inverse属性指定关联的哪一方负责维护关系;Cascade属性允许在操作实体时自动触发其他操作。 - **延迟加载**:一种优化策略,只有当真正需要时才加载关联的对象。 #### 九、事务管理 - **...

    hibernate入门

    ### hibernate入门知识点详解 #### 一、Hibernate简介与应用场景 **Hibernate** 是一款开源的对象关系映射(ORM)框架,它提供了强大的解决方案,用于处理Java应用中的数据持久化问题。对于初学者来说,理解...

    Hibernate 简单 PPT 总结

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

    Hibernate 入门

    - 本篇概述了Hibernate入门所需了解的关键知识点,从环境搭建到核心概念再到实际应用场景均有涉及。学习Hibernate不仅可以提升开发效率,还能帮助开发者更好地理解ORM框架的工作原理和技术优势。通过上述内容的学习...

    Hibernate_DEV_GUIDE

    - **Inverse和Cascade**:用于控制关联关系中对象的级联操作。 - **延迟加载(LazyLoading)**:这是一种优化策略,只有在真正需要的时候才加载关联对象的数据,以减少内存占用和提高性能。 #### 八、事务管理 - **...

    hibernate之一对多配置demo

    这里的`&lt;set&gt;`标签表示一个集合,`name`属性指定了Java对象中的集合属性名,`table`是数据库中的表名,`inverse="true"`表示维护关系的责任在多方,`one-to-many`标签则定义了与多方类的关联。 2. Java类的实体...

    经典hibernate教程,从入门到精通

    - 明确如何配置关联的属性,如mappedBy、inverse、fetch等,理解它们在关系维护中的作用。 9. **延迟加载和立即加载**: - 延迟加载:默认行为,只有在真正使用到关联对象时才去数据库加载,节省资源。 - 立即...

    Hibernate学习

    它通过使用描述对象和数据库之间映射的元数据,将应用程序的数据对象自动持久化到关系型数据库中。这种框架的主要优势在于它极大地简化了数据访问层的开发工作,让开发者可以更加专注于业务逻辑而不是底层的数据库...

    Hibernate开发指南

    Hibernate是一种广泛使用的开源对象关系映射(ORM)框架,主要用于在Java环境中实现面向对象的编程模型和关系数据库之间的映射。本文档《Hibernate开发指南》作为一本手册,为开发者提供了一个全面的入门和进阶...

    Hibernate开发指南.pdf

    本书不仅涵盖了Hibernate的基础知识,还提供了许多实战经验和技巧,特别适合那些希望在Java应用程序中实现高效对象关系映射(ORM)的开发者阅读。 #### 二、准备工作 在开始学习Hibernate之前,首先要做好一些准备...

    spring hibernate struts

    - **inverse**:反转控制,用于指定关联关系的维护方。 - **LazyLoading**:延迟加载,只有当真正需要时才加载关联对象。 ##### 4.6 一对一表关联操作 - 通过主键关联或外键关联实现两个表之间的关联。 - 使用`@...

    用spring、Hibernate、Struts组建轻量级架构

    - **Inverse**:在关联关系中指定一方为反向方,用于管理关联关系的变化。 - **LazyLoading**:延迟加载策略,只有在真正需要时才加载数据。 **4.6 表关联操作** Hibernate支持多种表关联操作,如一对一、一对多和...

    java 框架课件

    - **`inverse`属性**:用来决定是由哪一方来维护关联关系。通常,将数量较少的一方设为主动方,数量较多的一方设为被动方,以提高性能。 - **`cascade`属性**:用于指定在进行某种操作时,是否对关联的实体也执行...

    hibernate多表操作实例代码

    在Hibernate中,这种关系可以通过添加中间表(也称为关联表或第三方表)来实现。中间表通常包含两个外键,分别引用两个原始表的主键。 **二、数据库表的创建** 在数据库层面,你需要创建三个表:员工表(Employee...

Global site tag (gtag.js) - Google Analytics