`
jaesonchen
  • 浏览: 311541 次
  • 来自: ...
社区版块
存档分类
最新评论

hibernate设置inverse 、cascade 、fetch

 
阅读更多

  * fetch={select/join},默认为select。

  * fetch="select" 表示另外发送一条sql语句进行关联查询。

  * fetch="join" 表示进行表连接查询。设置为join时,lazy=true失去作用。

 

  * inverse控制的关联关系更新在session.flush时执行,所以在save/update时引发更新关联关系的

    insert/update/delete sql总是在最后执行。delete时引发的更新关联关系的update/delete sql总是在

    最前面执行。

  * inverse 只对one2many many2many有效,对many2one one2one 无效。

    由于one方维护关联关系时会发出update更新sql,所以通常在many方维护关联关系。

 

  * cascade 一般不对many2one,many2many,constrained=true的one2one 设置级联删除。
  * cascade几种取值:
     save-update:     级联保存(load以后如果子对象发生了更新,也会级联更新). 但它不会级联删除
     delete:               级联删除, 但不具备级联保存和更新
     all-delete-orphan: 在解除父子关系时,自动删除不属于父对象的子对象, 也支持级联删除和级联保存更新.
     all:                     级联删除, 级联更新,但解除父子关系时不会自动删除子对象. 
     delete-orphan:   删除所有和当前对象解除关联关系的对象

 

  * 在one2many和many2many的set中设置cascade="all-delete-orphan" 时,在update/flush/commit的

    时候不能直接设置clazz.setStudents(null);

    会引发异常:A collection with cascade="all-delete-orphan" was no longer referenced by the owning

    entity instance。delete操作时,可以直接设置null,这样只会删除clazz表和更新Student表记录。

    新建one时,可以设置clazz.setStudents(null);这样只会保存clazz表记录。

 


  * one2many 单向关联:
    <set name="students" cascade="save-update">
         <key>
             <column name="clazz_id" length="32" />
        </key>
        <one-to-many class="com.jaeson.hibernatestudy.bean.Student" />
    </set>
    若set设置inverse="true"时,将由多方Student维护关联关系,由于是单向关联,所以多方Student将无法

    维护外键,即clazz_id将为null。
    缺省inverse="false" 表示由一方Clazz维护外键关联关系,所以在保存时会发出update语句用于更新

    Student的外键clazz_id。

    当执行session.save(student)时,若clazz_id为not-null,此时将会出项插入异常,所以在one2many单向

    关联时需要设置外键clazz_id的属性为not-null="false"。
    cascade="save-update" 表示保存Clazz时级联保存Set里关联的Student对象,通常用于<Set>等集合

    关联。若没有设置cascade属性,则必须显式保存Student对象session.save(student),否则Clazz在维护

    关联关系时会抛出org.hibernate.TransientObjectException异常。

    Hibernate: insert into db4myeclipse.clazz (name, id) values (?, ?)
    Hibernate: insert into db4myeclipse.student (name, sex, id) values (?, ?, ?)
    Hibernate: update db4myeclipse.student set clazz_id=? where id=?

  * many2one 单向关联:

    需要先保存一方Clazz,再保存多方Student,这样只会有2条insert sql。否则会引发2条insert和一个

    update关联关系的sql。

    <many-to-one name="clazz" class="com.jaeson.hibernatestudy.bean.Clazz" fetch="join">
        <column name="clazz_id" length="32" not-null="true" />
    </many-to-one>
    fetch="join"时,lazy="true"失去效果,将会和Student一起进行inner join查询。
    由于是由多方Student维护外键关联关系,所以外键clazz_id可以设置为not-null="true"。
    在保存时需要先保存关联对象Clazz:

    session.save(clazz);
    session.save(student);

    否则Student在维护关联关系时会抛出:

    org.hibernate.action.internal.UnresolvedEntityInsertActions异常。
    Attempting to save one or more entities that have a non-nullable association with an unsaved

    transient entity.
    Hibernate: insert into db4myeclipse.clazz (name, id) values (?, ?)
    Hibernate: insert into db4myeclipse.student (clazz_id, name, sex, id) values (?, ?, ?, ?)

 

 

  * many2one 双向关联:

    <set name="students" cascade="save-update" inverse="true">
        <key>
            <column name="clazz_id" length="32" not-null="true" />
        </key>
        <one-to-many class="com.jaeson.hibernatestudy.bean.Student" />
    </set>
    <many-to-one name="clazz" class="com.jaeson.hibernatestudy.bean.Clazz" fetch="join">
        <column name="clazz_id" length="32" not-null="true" />
    </many-to-one>
    fetch="join"时,lazy="true"失去效果,将会和Student一起进行inner join查询。
    由于设置了inverse="true",所以将由多方Student维持关联关系。
    没有设置cascade时必须先保存Clazz对象,再保存Student对象;否则会抛出

    org.hibernate.action.internal.UnresolvedEntityInsertActions异常。
    Attempting to save one or more entities that have a non-nullable association with an unsaved

    transient entity.
    若Clazz设置了cascade="save-update"时,可以只执行session.save(clazz)。
    Hibernate: insert into db4myeclipse.clazz (name, id) values (?, ?)
    Hibernate: insert into db4myeclipse.student (clazz_id, name, sex, id) values (?, ?, ?, ?)

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    hibernate

    根据提供的文件信息,我们可以深入探讨Hibernate框架中的几个关键概念,特别是`fetch`, `lazy`, `cascade`, 和 `inverse`关键字的使用与理解。这四个概念在处理对象关系映射(ORM)时非常重要,尤其是在Java环境下...

    hibernate常用关联映射源码(很实用)

    该资源包括了hibernate开发中的常见关联映射的源代码,其中包括:one2one,one2many,many2many等,还有继承映射,inverse,fetch,cascade关键字的应用等,对初学者来说,是很实用的,难度适中,很好理解

    Hibernate笔记

    &lt;set name="students" inverse="true" cascade="all" fetch="subselect"&gt; ``` #### 五、批量处理与性能优化 - **Batch Size**: Hibernate支持批量处理,可以通过设置`batch_size`属性来控制批量加载的数量...

    Hibernate双向一对多

    4. **inverse属性**:在`@OneToMany`上设置`inverse`为`true`表示被引用的一方负责维护关系,否则由引用的一方维护。 **示例代码** ```java @Entity public class Class { @Id private Long id; @OneToMany...

    Hibernate实体关联速查表

    使用`@ManyToOne`注解,同样可以设置`fetch`和`cascade`属性。例如: ```java @Entity public class Order { @ManyToOne @JoinColumn(name = "user_id") private User user; } @Entity public class User { //...

    hibernate自身关联一对多实例(树形结构)

    例如,添加一个新节点到树形结构中,可以先创建父节点和子节点对象,然后设置它们的引用关系,最后将父节点保存到数据库,Hibernate会自动处理关联关系。 ```java ParentEntity parent = new ParentEntity(); List...

    hibernate的多种映射关系

    `fetch` 属性在 `@ManyToOne` 和 `@OneToMany` 中用来设置加载策略。 8. **反向引用 (Inverse)** 在一对多关系中,可以指定哪一方负责维护关系。通过 `mappedBy` 参数在 `@OneToMany` 或 `@ManyToMany` 注解中,...

    hibernate一对多代码

    如果希望在加载父对象时同时加载子对象,可以设置`fetch`属性为`join`。 6. **性能优化**: 为了提高性能,可以使用`@Cacheable`和`@Cache`注解进行缓存配置,减少数据库查询次数。另外,通过合理设计JOIN和子查询...

    Hibernate关联关系疑问

    6. **级联操作(Cascades)**:通过设置cascade属性,可以控制一个实体的生命周期操作(如保存、更新、删除)是否影响到其关联的实体。谨慎使用,因为不当设置可能会导致数据意外丢失。 7. **反向关联(Inverse)**...

    hibernate 一对多

    若希望在加载父实体时同时加载所有子实体,可设置`fetch="join"`,实现急加载。 六、性能优化 1. 避免N+1查询问题:在处理一对多关系时,可能会出现多次查询,导致性能下降。使用HQL(Hibernate Query Language)或...

    Hibernate关系映射

    通过`cascade`属性,可以设置级联操作,比如删除员工时,是否自动删除其所属部门。常见的级联类型包括`CascadeType.ALL`、`CascadeType.PERSIST`等。 3. **外键维护:** 默认情况下,Hibernate会维护从多的一方到...

    Hibernate一对多映射配置详解

    4. 外键约束:在数据库中,可以设置外键约束以确保数据一致性,但不是必须的,Hibernate可以通过程序逻辑实现数据一致性。 总之,Hibernate的一对多映射配置提供了灵活的方式,允许开发者根据需求选择XML或注解方式...

    Hibernate(一对多表操作)

    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL) private Set&lt;Order&gt; orders; ``` 这里`CascadeType.ALL`表示在保存或删除用户时,也会相应地保存或删除所有关联的订单。 ### 6. 性能优化 在一对多...

    Hibernate使用技巧汇总

    - `cascade`只能设置为`insert-update`。 - **示例**: - `group1.getRoles().add(role1);` - `role1.getGroups().add(group1);` - 分别保存`role1`和`group1`。 #### 十一、VO与PO的转换 - **VO**: View ...

    Hibernate 对集合属性的操作.zip_hibernate

    - **一对多(OneToMany)**:使用`&lt;list&gt;`、`&lt;set&gt;`或`&lt;bag&gt;`,并通过`inverse`属性指定维护端,`cascade`属性控制级联操作。 - **多对一(ManyToOne)**:通过`&lt;many-to-one&gt;`标签,指定引用的目标实体类以及引用...

    Hibernate之一对多关联

    - 谨慎使用`inverse`属性,设置为`true`时,由子类负责维护关联,可能引发数据一致性问题。 - 使用JOIN fetch或子查询来避免N+1查询问题。 综上所述,Hibernate的一对多关联映射是实现Java对象与数据库表之间关系...

    Hibernate一对多(多对一)双向关联(annotation/xml)

    若希望关联实体与主实体一起加载,可以设置`fetch = FetchType.EAGER`。 6. **集合类型的选择**(Set/List/Bag) - 在`@OneToMany`关联中,集合类型如`Set`、`List`和`Bag`各有特点。`Set`不允许重复元素,`List`...

    hibernate 多对多操作

    在多对多映射中,这两个标签用于定义关系的一端,它们包含属性如inverse(反向),cascade(级联操作),fetch(加载策略)等。 4. **中间表与关联表**: 在多对多关系中,通常需要一个中间表来存储两个实体的主键,...

    Hibernate_h_源码

    4. **fetch策略**:通过`fetch`属性可以指定加载关联的方式,如`FetchType.LAZY`(懒加载)和`FetchType.EAGER`(立即加载)。默认情况下,一对多关系是懒加载的,以避免不必要的性能开销。 5. **级联操作**:通过`...

Global site tag (gtag.js) - Google Analytics