`
chenyuguxing
  • 浏览: 39210 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

关于 Hibernate 级联操作

 
阅读更多
EJB3 支持的操作类型
  [java]
  /**
  * Cascade types (can override default EJB3 cascades
  */
  public enum CascadeType {
  ALL,
  PERSIST,
  MERGE,
  REMOVE,
  REFRESH,
  DELETE,
  SAVE_UPDATE,
  REPLICATE,
  /** @deprecated use @OneToOne(orphanRemoval=true) or @OneToMany(orphanRemoval=true) */
  @Deprecated
  DELETE_ORPHAN,
  LOCK,
  /** @deprecated use javax.persistence.CascadeType.DETACH */
  @Deprecated
  EVICT,
  DETACH
  }
  级联更新保存
  [java]
  @JoinColumn(name = "conf_file_id", referencedColumnName = "conf_file_id",insertable = true,updatable = true)
  @Cascade(value = {org.hibernate.annotations.CascadeType.SAVE_UPDATE})
  级联删除
  [java]
  @OneToMany(mappedBy = "projectByProPlanId",orphanRemoval=true)
  @Cascade(value = {org.hibernate.annotations.CascadeType.SAVE_UPDATE})
  save-update: 级联保存(load以后如果子对象发生了更新,也会级联更新)。 但它不会级联删除
  delete: 级联删除, 但不具备级联保存和更新
  all-delete-orphan: 在解除父子关系时,自动删除不属于父对象的子对象, 也支持级联删除和级联保存更新。
  all: 级联删除, 级联更新,但解除父子关系时不会自动删除子对象。
  delete-orphan:删除所有和当前对象解除关联关系的对象
  注意:以上设在哪一段就是指对哪一端的操作而言,比如delete,如果设在one的一端的<set>属性里,就是当one被删除的时候,自动删除所有的子记录;
  如果设在many一端的<many-to-one>标签里,就是在删除many一端的数据时,会试图删除one一端的数据,如果仍然有many外键引用one,就会报"存在子记录"的错误;如果在one的一端同时也设置了cascade="delete"属性,就会发生很危险的情况:删除many一端的一条记录,会试图级联删除对应的one端记录,因为one也设置了级联删除many,所以其他所有与one关联的many都会被删掉。
  所以,千万谨慎在many一端设置cascade="delete"属性。
  故此cascade一般用在<one-to-one>和<one-to-many>中
  很多人对持久层概念搞不清JPA、Hibernate、EJB3.0的关系,这里做一下简单的说明:JPA是一个持久层设计接口,EJB3.0和Hibernate是具体的实现类,EJB3.0和Hibernate的功能近似相等的(Hibernate没有Session Bean,Spring MVC3的SessionAttribute跟Session Bean近似)。
  理论是使用JPA接口可以无缝切换持久层实现,但是仅仅是理论上!!!
  JPA是在Hibernate成熟并大行其道的时候才推出的,基本上是借鉴Hibernate的优点,做了一个统一的标准而已,JPA1.0没有一对多的级联删除配置,也许JPA2.0里才有吧(这里没做过调研)
  @OneToMany(mappedBy = "commentTeam")
  @Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE,org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
  private Set<CommentTeamMember> commentTeamMembers;
  这里为了说明,只贴出一对多的关键代码,其它无关的注解已忽略掉,以免造成干扰。
  这里重点说明一下四个常用的注解配置的区别:
  CascadeType.SAVE_UPDATE
  CascadeType.ALL
  CascadeType.DELETE
  CascadeType.DELETE_ORPHAN

  之所有之列出这四个,是因为我不想跟书本上把所有的概念都罗列出来。基本上开发时其中的3个都以及足够用了,下面我结合代码演示一下他们之间的区别,以及使用的时候注意的地方。

CascadeType.SAVE_UPDATE:Hibernate专有的,JPA并不支持,作用是级联保存、级联更新(注:JPA很恶心,要么你配置
  CascadeType.ALL,要么你配CascadeType.SAVE+CasadeType.Merge.八卦一句:专家虽牛,多年不写代码,定的标准让编码麻烦呀!)
  CascadeType.ALL:级联保存、修改、删除、同步,一般很少用,看看控制台的一长串SQL就知道性能低下,你没改的关联表也给你发update语句,我从来没用过这个属性。
  CascadeType.DELETE:当调用session.delete(A)的时候,级联删除关联的对象。(注:先调用A.setB(null),再调用session.delete(A),这样是级联删不掉B的。
  CascadeType.DELETE_ORPHAN:一对多级联删除。
  下面重点来说说这个CascadeType.DELETE_ORPHAN:
  看过API、开发指南,级联删除就一个经典的
  @OneToMany(mappedBy = "commentTeam")
  @Cascade({CascadeType.SAVE_UPDATE,CascadeType.DELETE_ORPHAN})
  private Set<CommentTeamMember> commentTeamMembers;
  mappedBy不可少,映射A->B一对多的另一边控制反转(谁控谁的问题),新版的Hibernate3.4中配置更简单,变一句了,更简洁吧?
  @OneToMany(mappedBy = "commentTeam",orphanRemoval=true)
  private Set<CommentTeamMember> commentTeamMembers;
  CommentTeam commentTeam=this.getHibernateTemplate.get(CommentTeam.class,id);
  commentTeam.setCommentTeamMember(null);//想级联删除子表数据
  this.getHibernateTemplate.saveOrUpdate(commentTeam);
  这样级联删除却没有发生,为什么呢?
  再来一个例子
  CommentTeam commentTeam=this.getHibernateTemplate.get(CommentTeam.class,id);
  Set<CommentTeamMember> commentTeamMembers=new HashSet<CommentTeamMember>();
  commentTeam.setCommentTeamMember(commentTeamMembers);//想级联删除子表数据或增减替换对象
  this.getHibernateTemplate.saveOrUpdate(commentTeam);
  这个例子级联删除的效果也没发生!即使commentTeamMembers里有若干个对象。
  成功执行级联删除的语法:
  CommentTeam commentTeam=this.getHibernateTemplate.get(CommentTeam.class,id);
  commentTeam.getCommentTeamMember()。clear();//注意这里引用的集合还是原来的集合,这里没有重新new过
  commentTeam.getCommentTeamMember()。add(new CommentTeamMember());//如果想替换为新的集合可以用addAll方法
  this.getHibernateTemplate.saveOrUpdate(commentTeam);
  分析一下原因:级联删除起作用的前提是关联的集合对象不能重新指向新的引用,必须在原有的集合里操作新增、删除、清空元素,像上面的setXXX(null)的方法等是起不到级联删除作用的,大概是Hibernate自认自己原生的集合对象吧,自己New的放进行级联删除无效!

分享到:
评论

相关推荐

    Hibernate的级联操作(增,删,该)

    在Hibernate中,级联操作(Cascading Operations)是一种高级特性,它使得对象之间的关联关系在数据库层面得以同步更新。当我们对一个实体对象进行操作时,可以设置级联属性,让这些操作自动传播到与之相关联的其他...

    Hibernate级联操作一对多demo

    在这个" Hibernate级联操作一对多demo "中,我们将探讨如何在一对多的关系中应用级联操作。 一对多关系是数据库中常见的关系类型,它表示一个实体(如部门)可以有多个相关实体(如员工)。在Hibernate中,这种关系...

    hibernate 级联查询

    7. **源码解析**:可能涉及Hibernate框架源码中关于级联操作的部分,帮助深入理解其内部工作原理。 8. **注意事项**:级联查询在多对多关联时需要特别注意,因为可能会导致数据冗余或者一致性问题。 以上是对...

    Hibernate级联操作.docx

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

    关于Hibernate级联删除的问题.doc

    在文档中提到的场景下,我们来详细探讨Hibernate级联删除的原理和配置方法。 首先,我们要理解关系映射中的几个关键概念。在给出的例子中,有四个表:A、AA、B和BB,它们之间存在一对多(one-to-many)和一对一...

    hibernate级联增删改查

    本主题将深入探讨"hibernate级联增删改查",特别是针对"t_card主表"和"t_person从表"的关系。 首先,级联操作在Hibernate中是一种配置,用于指定当主表中的实体发生变化时,是否以及如何更新或删除关联的从表实体。...

    hibernate many-to-many级联保存,级联更新,级联删除

    在Hibernate中,级联操作可以通过`cascade`属性进行配置。主要有以下几种级联类型: 1. `save-update`:当保存或更新父实体时,会自动保存或更新所有关联的子实体。 2. `merge`:在调用`session.merge()`时,不仅...

    hibernate 级联(cascade和inverse)一对多

    一、Hibernate级联(Cascade) 级联操作允许我们将对一个实体的更改自动应用到与之关联的其他实体。在一对多关系中,如果一个实体(父实体)与多个实体(子实体)关联,设置级联属性可以确保在处理父实体时,子实体...

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

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

    Hibernate 一对多、多对一、级联、加载、反转

    例如,如果在`User`和`Order`的关系中,我们希望由`User`来控制级联操作,可以将`@OneToMany`的`mappedBy`属性设在`User`上,然后设置`inverse`属性为`true`,使得`User`成为关系的主控方,这样在处理`User`时,级联...

    Hibernate的缓存级联查询

    在IT领域,尤其是在Java开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它允许开发者用面向对象的方式操作数据库。尽管随着Spring Data JPA等现代技术的崛起,Hibernate的使用频率有所下降,但其核心...

    hibernate基础 二 关联映射 级联操作

    ### Hibernate基础之关联映射与级联操作 ...以上是关于Hibernate中关联映射和级联操作的基础知识概述,掌握了这些内容后,开发者能够在实际项目中更加灵活高效地使用Hibernate进行数据持久化操作。

    用hibernate做的省市县三级级联,

    `IUser.java`可能是一个接口,定义了用户相关的一些操作,但在这个特定的场景中,它可能并不直接相关,因为三级联动主要是关于地理区域的。 至于`mysql-connector-java-5.0.6-bin.jar`,这是MySQL数据库连接器,...

    用Struts2+Spring+Hibernate三大框架完成的级联操作

    在级联操作中,Hibernate可能被用来处理省市县和年月日的数据存取,通过HQL(Hibernate Query Language)或者Criteria API来执行SQL查询,获取级联选择的数据。 级联操作的核心在于数据间的关联,例如选择一个省后...

    Hibernate cascade (级联).doc

    ### Hibernate级联(Cascade)详解 #### 一、概述 Hibernate 是一款强大的对象关系映射 (ORM) 框架,它允许开发人员将 Java 对象模型映射到数据库表,从而极大地简化了数据访问层的开发工作。在 Hibernate 中,...

    Hibernate_范型_级联

    综上所述,这些文件涵盖了Hibernate中范型的应用、级联操作的原理以及不同关联类型的配置和测试。通过学习和实践这些内容,开发者能够更好地掌握Hibernate在实际项目中的使用,提高数据库操作的效率和代码的健壮性。

    框架[Hibernate]利用Hibernate进行一对多的级联操作-Web实例 java

    【框架】[Hibernate]利用Hibernate进行一对多的级联操作-Web实例 java

    hibernate3.2的级联关系_JavaProject

    在Hibernate中,可以通过`@OneToMany`注解来定义这种关系,并通过`cascade`属性设置级联操作,例如`CascadeType.ALL`表示所有操作都将级联。 2. **一对一(OneToOne)**:这种关系意味着两个实体之间存在一对一的...

    HibernateHQL级联注意事项[归类].pdf

    - 在编写HQL级联查询时,需要理解级联操作的类型,如`save-update`、`fetch`、`all-delete-orphan`等,它们会影响对象的持久化行为。 - 考虑性能影响,过多的级联查询可能导致大量的数据库交互,可能需要优化查询...

Global site tag (gtag.js) - Google Analytics