`

inverse和cascade的用法

    博客分类:
  • SSH
阅读更多

这两个属性都用于一多对或者多对多的关系中。而inverse特别是用于双向关系,在单向关系中我们并不需要。

 

Cascade代表是否执行级联操作,Inverse代表是否由己方维护关系。

 

Cascade:

 

Cascade属性的可能值有

    all: 所有情况下均进行关联操作,即save-update和delete。
    none: 所有情况下均不进行关联操作。这是默认值。
    save-update: 在执行save/update/saveOrUpdate时进行关联操作。
    delete: 在执行delete 时进行关联操作。

    all-delete-orphan: 当一个节点在对象图中成为孤儿节点时,删除该节点。比如在一个一对多的关系中,Student包含多个book,当在对象关系中删除一个book时,此book即成为孤儿节点。

 

Inverse:

 

Inverse属性的可能值是true或者false,默认为false:

 

     false代表由己方来维护关系,true代表由对方来维护关系。在一个关系中,只能由一方来维护关系,否则会出问题(解疑中会讲到);同时也必须由一方来维护关系,否则会出现双方互相推卸责任,谁也不管。

 

一多对的例子:

 

有两个类,Father和Child,是一对多的关系。下面这段hbm配置是从Father.hbm.xml中摘取的。

 

 

<set name="children" lazy="true" cascade="all" inverse="true">
    <key column="fatherid"/>
    <one-to-many class="my.home.Child"/>
</set>  

 

我们知道cascade和inverse的值对会有四种组合的可能(在此仅先假定cascade值为none或all)。

 

有如下一段代码:

FatherDao fatherDao = new FatherDao();   
  
Father father = new Father("David");   
Child child1 = new Child("David Junior One");   
Child child2 = new Child("David Junior Two");   
  
father.add(child1);   
father.add(child2);   
  
fatherDao.save(father);  

 

 

1. 如果cascade="all"且inverse="false"时:

 

此时可以看到log里面:

// 执行对father的插入   
Hibernate: insert into father (name) values (?)   
  
// cascade = 'all',所以进行级联操作   
Hibernate: insert into child (name, fatherid) values (?, ?)   
Hibernate: insert into child (name, fatherid) values (?, ?)   
  
// inverse = 'false',由father来维护关系(可以看到这些操作是多余的)   
Hibernate: update child set fatherid =? where ID=?   
Hibernate: update child set fatherid =? where ID=?  

 

2. 如果cascade = "none" 且 inverse = "false":

// 执行对father的插入   
Hibernate: insert into father (name) values (?)   
  
// inverse='false',所以更新关系   
Hibernate: update child set fatherid =? where ID=?   
  
// 但由于cascade='none',child并未插入数据库,导致如下exception   
org.springframework.dao.InvalidDataAccessApiUsageException: object references an unsaved transient instance  

 

 

3. 如果cascade = "all" 且 inverse = "true"

// 执行对father的插入   
Hibernate: insert into father (name) values (?)   
  
// cascade='all',执行对child的插入   
Hibernate: insert into child (name, fatherid) values (?, ?)   
Hibernate: insert into child (name, fatherid) values (?, ?)   
  
// 但由于inverse='true',所以未有对关系的维护。但由于一对多的关系中,关系本身在“多”方的表中。所以,无需更新   
关系。  

 

 

4. 如果cascade = "none" 且 inverse = "true"

// 只执行对father的插入   
Hibernate: insert into father (name) values (?)  

 

 

可以看到,对于一对多关系,关系应由“多”方来维护(指定“一”方的inverse为true),并且应在“一”方指定相应的级联操作。

 

多对多:

 

在多对多关系中,inverse可以为任何一方,没有什么区别。

 

解疑:

 

为什么在多对多中不能由双方都来维护关系了:因为这样会导致重复更新中间表的可能,报出重复值的错误。

 

那么如何在多对多的双向关联中使双方都能维护关系:最好让控制关系的那方来更新关系,如果想让另一方也来维护关系,那么只有在操作这一方的数据时“显式”更新中间表了吧。

 

注意:

 

同时注意在双向关联中,对象之间的关联跟上面提及的关系表维护没有关系。一个是对象/java层面的,一个是hibernate数据库层面的。如果你想在更新一方时,也更新另一方的对象集合,请看下面这段代码:

 

这是Person类中的一段代码,Person和Event是多对多的双向关联关系,他们在对方类中的集合分别为participants和events。关系表由Person维护,所以对象关系的维护也在Person类中,而不是Event类中。

 

public void addToEvent(Event event) {   
        this.getEvents().add(event);   
        event.getParticipants().add(this);   
}   
  
public void removeFromEvent(Event event) {   
        this.getEvents().remove(event);   
        event.getParticipants().remove(this);   
}  

 

分享到:
评论

相关推荐

    inverse和cascade使用阐述

    至于博文链接,虽然没有提供具体内容,但可以推测博主可能详细讲解了在特定工具或框架中如何配置和使用“inverse”和“cascade”,并可能给出了一些示例和最佳实践。 在压缩包文件“inverse_cascade”中,可能包含...

    hibernate inverse和cascade的详细讲解

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

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

    `inverse`和`cascade`属性是Hibernate集合映射中非常重要的概念,它们帮助开发者更灵活地控制实体之间的关系以及操作的级联行为。合理地使用这两个属性,不仅可以简化代码,还能提高程序的性能和健壮性。然而,不当...

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

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

    hibernate 级联(cascade和inverse)一对多

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

    hibernate_second3项目源码

    在这个项目中,开发者创建了一个案例,通过对比不同配置下`inverse`和`cascade`的效果,来帮助理解它们的用法。案例可能包含了以下部分: 1. 定义了具有`inverse`和`cascade`属性的实体类,可能包括一对多或者多对...

    Hibernate常见问题

    理解并正确使用Hibernate的`cascade`和`inverse`属性对于优化数据操作和避免数据一致性问题至关重要。在实际开发中,应根据业务逻辑和数据模型谨慎设定这些属性,以确保数据操作的正确性和高效性。

    Hibernate开发租房系统2 源码

    描述提到“使用cascade和inverse优化区和街道关联关系”,这意味着我们将深入理解Hibernate的cascade和inverse属性,以及它们在双向一对多关联关系中的应用。 Hibernate是Java领域中广泛使用的对象关系映射(ORM)...

    hibernate学习笔记

    &lt;set name="users" cascade="all" inverse="true"&gt; ``` 2. **UserInfo的映射文件`UserInfo.hbm.xml`**: 由于`inverse`属性在`Room`的映射中已经设置为`true`,因此`UserInfo`的映射文件中不需要显式声明`...

    Hibernate级联操作.docx

    在 Hibernate 中,级联操作(Cascade)和反向属性(Inverse)是管理对象关系的重要概念,特别是在处理一对多(One-to-Many)或多对一(Many-to-One)关系时。 **级联操作(Cascade)** 级联操作定义了当主对象被...

    java文集

    Java正则表达式 批量上传--采集 (多个文件夹) The Agile Way hibernate mapping文件中的标记详解:关系标记 ANT 安装使用及build.xml文档模板 inverse和cascade在关联更新中的作用 hibernate ...

    Hibernate开发指南

    Inverse和Cascade则用于控制实体间关联关系的传播。 延迟加载(Lazy Loading)是一种优化策略,可以提高性能,但需要在使用时注意其懒加载机制。事务管理部分介绍了基于JDBC和基于JTA(Java Transaction API)的...

    Hibernate开发指南(原版书)

    - **数据检索**:详细介绍Criteria和HQL(Hibernate Query Language)两种查询方式的使用方法,包括基本查询、条件过滤、排序及分页等高级功能。 - **数据关联**:覆盖了一对一、一对多和多对多三种关系的建模和映射...

    信号处理导论

    反滤波器(Inverse Filters)和稳定性问题(Stability)也是书中可能探讨的内容。 综上所述,《信号处理导论》一书系统地讲解了信号处理的诸多方面,从采样定理的基础知识到数字滤波器的设计,再到系统特性的分析和...

    python_markdown note1.md

    此外,还定义了一个逆向级联函数inverse_cascade,以及一个使用lambda表达式定义的辅助函数f_then_g,这些都展示了Python语言在函数式编程方面的灵活性。 在文件的另一部分,通过一个计算阶乘的函数展示了递归方法...

    java开始面试的第27天.doc

    本题主要考察了 Hibernate 中的级联操作,包括 `cascade` 属性的使用以及在 XML 映射文件中的配置。通过分析代码,我们可以了解到如何在实际开发中设置级联添加和删除,以及它们在一对多关系中的作用。理解这些知识...

    hibernate入门级教程,零基础哟

    - 本文档不仅涵盖了Hibernate的基本概念和使用方法,还深入探讨了一些高级特性和最佳实践,适合不同层次的Java开发者学习和参考。通过阅读和实践本文档中的内容,开发者可以更好地理解和应用Hibernate框架,提升开发...

Global site tag (gtag.js) - Google Analytics