`

Hibernate 的cascade属性的用法

阅读更多

hibernate一对多关系中,会用到级联操作.即:有collection的一端操作,被关联的表被自动操作.

这时有collection一端需要配置<set cascade="?">

即用在一对多的一方。

 

Cascade 属性值:

none:在保存、删除修改对象的时候,不考虑其附属物的操作

save-update:在保存、更新当前对象时,级联保存、更新附属物。

delete:在删除当前对象时,级联删除附属物。

all: 包含save-update和delete的操作,但不包括delete-orphan的操作。

delete-orphan:删除和当前对象解除关系的附属对象。

all-delete-orphan:所用情况。

 

例如:Team.hbm.xml

NONE:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.vo.Team" table="team" catalog="test" lazy="true">
        <id name="id" type="java.lang.Integer">
            <column name="ID" />
            <generator class="native" >
               
            </generator>
        </id>
        <property name="name" type="java.lang.String">
            <column name="Name" />
        </property>
        <set name="students"  cascade="none" lazy="false" batch-size="3">
            <key column="teamID"></key>
            <one-to-many class="com.vo.Student"></one-to-many>
        </set>
    </class>
</hibernate-mapping>

代码:

Session session = SessionUtil.getSession();
  Transaction tran = session.beginTransaction();
  Team team = (Team)session.get(Team.class, 4);

  Student addStu = new Student();

  addStu.setName("test");
  Student removeStu = (Student)session.get(Student.class, 15);
  team.getStudents().remove(removeStu);
  team.getStudents().add(addStu);
  tran.commit();
  session.close();

 

会报异常,异常原因是提示addStu为临时对象,他被持久化对象引用,而cascade="none",不能通过使用级联进行保存,所以异常是建议在清理缓存之前保存临时对象。

 

save-update

更改为cascade="save-update"

运行成功!对象已经被保存。但是发现所删除的student,并没有真正被删除,而只是将team_id设为了NULL,

结论是:从集合中删除这个对象并不会导致此对象在数据库中对应的记录删除,而只是将所对应的关联字段设置为了NULL。

 

delete

如果cascade设为delete,那么删除主题数据的时候,会级联删除所关联的对象。

 

delete-orphan

当你要删除集合中对象的时候,要采用这种方式:

 

Team team = (Team)session.get(Team.class, 10);
  Student removeStu = (Student)session.get(Student.class, 21);
  team.getStudents().remove(removeStu);

 

Team.hbm.xml

 <set name="students"  cascade="delete-orphan"  lazy="true" batch-size="3">
            <key column="teamID"></key>
            <one-to-many class="com.vo.Student"></one-to-many>
        </set>

 

Student.hbm.xml

 <many-to-one name="teamID" column="TeamID"  fetch="join"></many-to-one>

在STUDENT中不能设置cascade="all"

因为根据程序,当删除ID为21的学生时候,如果加了cascade="all"那么就是告诉程序去级联删除与之有关的TEAM,也就是将ID为10的TEAM也干掉了。如果干掉了ID为10的TEAM,那么与之有关的Student也将被删除,非常的危险。

所以一定要注意。

 

如 果设置cascade="all",则在调用session.delete(team);时,会删除TEAM下的所有STUDENT;如果是调用 team.getStudents().remove(stu);然后调用session.update(team)不会删除此STU,只会把该STU的 TEAM_ID设为NULL,所以想通过集合删除对象,需要设置cascade="delete-orphan"。

 

建议使用cascade="all-delete-orphan"。当然,根据项目、产品的实际需要,采用合适的配置项。

分享到:
评论

相关推荐

    详解Hibernate cascade级联属性的CascadeType的用法

    所以,适当的做法是,删除主表的同时,关联表的信息也要同时删除,在hibernate中,只需设置cascade属性值即可。 cascade表示级联操作,在hibernate配置注解@OneToOne,@OneToMany,@ManyToMany,@ManyToOne中的属性...

    hibernate cascade 测试demo

    本测试Demo主要目的是帮助我们理解如何在Hibernate中使用`cascade`属性来处理关联对象的数据操作。让我们深入探讨一下`cascade`的含义及其在实际开发中的应用。 `cascade`在Hibernate中的作用是当对一个实体进行...

    hibernate inverse和cascade的详细讲解

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

    hibernate 级联(cascade和inverse)一对多

    使用JUnit进行测试是验证Hibernate配置和功能的一种常见方法。你可以创建测试类,模拟数据的增删改查操作,然后检查数据库中的记录是否符合预期。例如,你可以创建一个父实体,添加一些子实体,并设置级联操作为`...

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

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

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

    ### 集合映射:cascade属性 `cascade`属性用于控制父实体的操作是否自动应用于子实体。在Hibernate中,当执行某些操作(如保存、删除或更新)时,可以使用`cascade`来决定这些操作是否应该级联到关联的实体上。 ##...

    Hibernate 对集合属性的操作.zip_hibernate

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

    cascade用法

    在对象关系映射(ORM)框架中,如Hibernate,`cascade`属性是一个非常重要的概念,它定义了在处理一个实体时如何自动处理与其关联的其他实体。`cascade`属性主要用于控制数据操作的传播,比如当你对一个实体进行保存...

    Hibernate开发租房系统2 源码

    1. **cascade属性**:在Hibernate中,cascade属性用于控制一个实体的持久化操作是否会影响到与其关联的其他实体。例如,如果我们删除一个区,可能希望同时删除该区下的所有街道。设置 cascade="all" 或 cascade=...

    hibernate-mapping参数详解

    默认值是`property`,意味着Hibernate将使用getter和setter方法来读写属性。如果自定义了访问策略,可以通过实现`PropertyAccessor`接口来指定。 2. `default-lazy`:默认情况下,未显式指定`lazy`属性的Java属性和...

    hibernate 中的lazy属性祥解.txt

    在探讨Hibernate框架中的`lazy`属性时,我们深入解析了其功能、应用场景以及与之相关的潜在问题,尤其关注于如何有效利用此特性以优化数据库性能和应用响应速度。 ### Hibernate框架简介 Hibernate是一个开放源码...

    Hibernate笔试题.doc

    在使用了 Hibernate 的系统中,要想在删除某个客户数据的同时删除该客户对应的所有订单数据,可以配置客户和订单关联的 cascade 属性为 all。 7. 一对多关联配置 在一对多关联配置中,存在错误的是 inverse 属性不...

    Hibernate常见问题

    1. **cascade属性**:`cascade`属性用于控制对象之间的级联操作。当在实体间设置`cascade`时,例如在一对多或多对多关系中,如果你在一个对象上执行`save()`, `update()`, `delete()`等操作,这些操作将自动传播到与...

    Hibernate 3.3 core API

    8. Cascade操作:通过在实体类的属性上使用@Cascade注解,可以设置级联操作,比如当删除一个父对象时,其关联的子对象也会被自动删除。 9. 第二级缓存:Hibernate提供了二级缓存机制,能够提高数据访问效率。...

    Hibernate 注解映射

    * cascade 属性:指定级联操作的行为,可以选择 CascadeType.PERSIST、MERGE、REMOVE、REFRESH 和 ALL。 * 在双向关联中,需要通过调用双方的 set 方法来建立关系。 Hibernate 注解映射提供了一种简单、灵活的方式...

    Hibernate教程

    3. 支持级联操作:在实体关系中设置cascade属性,如CascadeType.ALL,可自动处理相关对象的持久化操作。 通过学习本教程,读者将能够熟练掌握Hibernate的基本用法,理解其工作原理,并能够在实际项目中灵活运用,...

Global site tag (gtag.js) - Google Analytics