`

十四、关联关系中的CRUD_Cascade_Fetch

 
阅读更多

1    设定cascade以设定在持久化时对于关联对象的操作(CUD,R归Fetch管)

cascade并不影响读取,fetch才是控制读取


2    cascade仅仅是帮我们省了编程的麻烦而已,不要把它的作用看的太大,建议使用hibernate的cascade注解
a)    Cascade的属性是数组格式,指明做什么操作的时候关联对象是绑在一起的
       cascade={CascadeType.ALL}

CascadeType取值
ALL    Cascade all operations  所有情况
MERGE  Cascade merge operation  合并(merge=save+update)
PERSIST  Cascade persist operation  存储 persist()
REFRESH  Cascade refresh operation  刷新 ,A session里面需要读B session改过之后的数据
REMOVE   Cascade remove operation  删除

铁律:双向关系在程序中要设定双向关联
 铁律:双向mappedBy


3   fetch 

@ManyToOne,在查询的时候默认会把一的一方查询出来,即fetch=FetchType.EAGER

铁律:双向不要两边设置Eager(会有多余的査询语句发出,你取了我,我又会取你)
对多方设置fetch的时候要谨慎,结合具体应用,一般用Lazy不用eager,
特殊情况(多方数量不多的时候可以考虑,提高效率的时候可以考虑)


@OneToMany(mappedBy="group",cascade={CascadeType.ALL}, //控制增删改(即CUD)
                          fetch=FetchType.EAGER //控制查询(即R) EAGER值代表取出关联 LAZY值为不取关联
                          //多的一方fetch取值默认为LAZY 一的一方默认为EAGER
    )
另外:如果User类(即多的一方)中设置fetch=FetchType.LAZY 则在调用多(即Group)的对象值的时候
类似延迟加载 即需要在commit();之前 session还存在时调用 如:
System.out.println(user.getGroup().getName()); 
session.getTransaction().commit();

7    Update时@ManyToOne()中的cascade参数关系
    session.beginTransaction();
    User user = (User)session.load(User.class,1);
    //user对象属性改变 事务commit时自动判断与数据库原有数据不同 可自动update
    //此时的update与@ManyToOne()中的cascade或fetch参数取值无关
    user.setName("user1");
    user.getGroup().setName("group1");
    session.getTransaction().commit();
如果user改变在commit()之后 且想要执行Update方法时 user与group表同时更新则,则User类的cascade={CascadeType.ALL},并在程序中写如下代码:
    session.beginTransaction();
    User user = (User)session.get(User.class,1);
    session.getTransaction().commit();
    user.setName("user1");
    user.getGroup().setName("group1");
    Session session2 = sessionFactory.getCurrentSession();
    session2.beginTransaction();
    session2.update(user);
    session2.getTransaction().commit();
   
8    Delete时@ManyToOne()中的cascade关系
    如果User及Group类中均设为@ManyToOne(cascade={CascadeType.All}),那么在执行如下:
    session.beginTransaction();
    User user = (User)session.load(User.class,1);
    session.delete(user);
    session.getTransaction().commit();
    注意:此处删除的是 多对一(即User对Group) 中的“多”的一方(User类)

会删除user及user对应的group,再反向对应group的user都会删除,原因就是设置了@ManyToOne(cascade={CascadeType.All})

三种方法可避免全部删除的情况:
1.    去掉@ManyToOne(cascade={CascadeType.All})设置;
2.    直接写Hql语句执行删除;
3.    将user对象的group属性设为null,相当于打断User与Group间的关联,代码如下
        session.beginTransaction();
        User user = (User)session.load(User.class,1);
        user.setGroup(null);
        session.delete(user);
        session.getTransaction().commit();
注意:如果删除的是 多对一中的“一”的一方(Group类)时,如果使用第3种方式(user属性设为null)来打断两个对象间的关联的话,代码与之前不同,如下:
    session.beginTransaction();
    Group group = (Group)session.load(Group.class,1);
    //循环将group中的set集合下的各个user对象设为null
    //相当于先将数据库中user表中与group表关联的字段(即groupid)设为null
    for(User user :group.getUsers()){
        System.out.println(user.getName());
        user.setGroup(null);
    }
    //再将group的set集合设为null,相当于将group表中与user表关联的字段(即userid)设为null
    //此句的前提是user表中的关联字段(groupid)已经为null,如没有则相当于破坏了一对多关联,会报错
    group.setUsers(null);
    session.delete(group);
    session.getTransaction().commit();

分享到:
评论

相关推荐

    Hibernate教程15_关联关系中的CRUD Cascade_Fetch

    在本教程中,我们将深入探讨Hibernate中的关联关系及其在CRUD操作中的应用,特别是关于Cascade和Fetch策略。Hibernate是Java领域广泛使用的对象关系映射(ORM)框架,它允许开发者用面向对象的方式来处理数据库交互...

    Hibernate关联关系的CRUD和集合映射(annotation)

    本文将深入探讨Hibernate中的关联关系、CRUD操作以及集合映射(基于注解的方式)。关联关系是数据库设计中的核心概念,而Hibernate通过注解使得这种关系在代码中得以体现,简化了开发工作。 ### Hibernate关联关系 ...

    Hibernate教程04_关系映射之一对一单向外键关联

    6. **懒加载与立即加载**:在一对一关系中,可以设置fetch属性来控制关联对象的加载策略,如懒加载(延迟加载)和立即加载。 7. **级联操作**:通过cascade属性,可以设置在操作主体对象时是否同时操作关联对象,...

    hibernate基于主外键的一对多/多对一关联

    最后,当我们使用Hibernate进行CRUD操作时,这些关联关系会影响到对象的保存、更新和删除。例如,如果一个User包含多个Order,那么在保存User时,Hibernate会自动将关联的Order一起保存。同样,删除User时,如果不...

    JPA视频教程_使用jpa映射关联和继承

    在映射关联时,我们需要指定关联的属性,使用`mappedBy`属性指定被关联方,以及设置`fetch`和`cascade`策略来控制加载和操作行为。 **3. 继承映射** 在面向对象编程中,类的继承有助于代码复用和结构化设计。JPA...

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

    在这个例子中,`<set>`元素表示一个集合关联,`inverse="true"`表示"多方"维护关联关系,`cascade="all-delete-orphan"`表示级联操作,删除父项时会删除所有子项。 在实际操作中,我们可以通过Hibernate的Session...

    hibernate双向一对多关联映射(注解版)

    在Java的持久化框架Hibernate中,双向一对多关联映射是一种常见的关系映射方式,它模拟了数据库中的外键关联,使得一个实体可以拥有多个另一个实体的实例。在这个注解版的实现中,我们将深入探讨如何使用Hibernate的...

    manytomany关系

    `@ManyToMany`注解的参数`cascade`用于指定级联操作,如`CascadeType.ALL`表示对集合中的所有元素执行CRUD操作时,会同步更新关联表。`@JoinTable`注解则用来定义中间关联表的元数据,包括表名、外键列名等。 在...

    hibernate单边多对一关系

    1. **多对一关联**:在数据库中,多对一关系意味着一个表(多方表)中的多个记录可以与另一个表(单方表)的一个记录相关联。例如,一个员工可以属于一个部门,而部门只有一个,这就是多对一关系。 2. **Hibernate...

    Hibernate期末作业一对多(连接表)

    7. **Cascade操作**:在一对多关系中,可以设置级联操作,比如`CascadeType.ALL`,这样对父对象的操作(如保存、更新、删除)会自动应用到子对象。 8. **Fetch策略**:通过`@OneToMany(fetch = FetchType.LAZY/...

    Hibernate Many-To-Many Mapping Annotations

    5. **清理策略**:通过`@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)`可以配置删除孤儿记录,即当从一方集合中移除元素时,相应的关联记录也会从中间表中删除。...

    Hibernate对象应设代码

    2. **级联操作**:通过`cascade`属性,可以在操作主对象时自动处理关联对象的CRUD操作,例如`@OneToMany(cascade = CascadeType.ALL)`。 3. **唯一约束**:在一对一关系中,通常需要确保关联字段在数据库层面有唯一...

    hibernate many to one

    在Java的持久化框架Hibernate中,"Many-to-One"关系是一种常见的关联映射类型,它表示一个实体(类)可以与多个其他实体实例相关联。在这个主题中,我们将深入探讨Hibernate如何处理这种关系,以及如何在实际编程中...

    JPA一对一关系实例配置

    在Java世界中,Java Persistence API (JPA) 是一种用于管理关系数据库的框架,它使得对象-关系映射(ORM)更加便捷。本实例将详细探讨JPA中的一对一(OneToOne)关系配置,以及如何在实际项目中实现。 一对一关系在...

    hibernate 一对多

    在Java的持久化框架Hibernate中,一对多关系是数据库中常见的关联类型,它表示一个实体可以与多个其他实体相关联。本案例将深入探讨如何在Hibernate中实现这种关系,以便在实际开发中更加灵活和高效地操作数据。 一...

    JPA 一对一实例配置

    通过以上配置,我们就可以在JPA中实现一对一关联,并进行相应的CRUD操作。在使用过程中,需要注意避免循环引用,因为这可能导致无限递归问题。同时,合理设计实体间的关联关系,可以提高代码的可读性和数据库操作的...

    hibernate中一对多配置

    在Java的持久化框架Hibernate中,一对多(One-to-Many)关系是数据库表之间非常常见的一种关联。这种关系表示一个实体(如一个用户)可以与多个其他实体(如用户的订单)相关联。相对应地,多对一(Many-to-One)...

    hibernate 一对多测试工程

    在这个工程中,我们可以通过具体的代码实例深入理解如何配置和操作数据库中的关联关系,特别是重点在于一对多的关系映射。 在Java对象关系映射(ORM)框架如Hibernate中,一对多关系是一种常见的数据库表关联类型,...

    hibernate一对一

    在实际项目中,我们常常会遇到实体类之间的一对一关联关系。本篇文章将深入探讨Hibernate中的一对一关联映射,通过一个小案例来帮助你更好地理解和掌握这个概念。 ### 1. 一对一关联概述 一对一关联是指两个实体类...

    Hibernate多对一映射(注解版)

    在数据库设计中,多对一关系表示一个实体可以与另一个实体的多个实例相关联。例如,一个部门可以有多名员工,但每个员工只能属于一个部门。在Hibernate中,这种关系可以通过注解来定义。 1. **注解配置** 在实体...

Global site tag (gtag.js) - Google Analytics