`
wolfandlili
  • 浏览: 77441 次
  • 性别: Icon_minigender_1
  • 来自: 河北
社区版块
存档分类
最新评论

重温Hibernate级联(转)

阅读更多
     本人乃普通人一个,放到人群中是找不到的那种,不比那些牛人能过目不忘,我相信那句话——书读百遍,其义自显,所以一本书我一般都读好几遍,第 一遍一般都是概读,达到初步掌握,能使用的地步,以后再一遍又一遍的精读,以便能够加深理解,从中得到新的体会。可以说级联是Hibernate的一大亮 点,也是比较麻烦的地方。下面就是我的读书记录,以及个人体会。

双向一对多父子关系

保存子

Parent p=(Parent)session.load(Parent.class.pid);
Child c=new Child();
c.setParent(p);
p.getChildren().add(c);
session.save(c);
session.flush():
为Parent添加一个addChild()方法
public void addChild(Child c){
c.setParent(this);
children.add(c);
}
这样上面的就可以替换为:
Parent p=(Parent)session.load(Parent.class.pid);
Child c=new Child();
p.addChild(c);
session.save(c);
session.flush():
以上是没有使用cascade参数,要是使用cascade参数,如cascade="all",以上简化为:
Parent p=(Parent)session.load(Parent.class.pid);
Child c=new Child();
p.addChild(c);
session.flush():
注意这里不用显式调用save方法了,同样的,保存或删除Parent对象的时候并不需要遍历其子对象,下面的代码会删除对象
p及其所有子对象对应的数据库记录。
Parent p=(Parent)session.load(Parent.class,pid);
session.delete(p);
session.flush();
然而,这段代码如下
Parent p=(Parent)session.load(Parent.class,pid);
Child c=(Child)p.getChildren().iterator().next();
p.getChildren().remove(c);
c.setParent(null);
session.flush();
不会从数据库删除c;它只会删除与p之间的连接(并且会导致违反NOT NULL约束,在这个例子中)。你要显式调用delete()来
删除Child。
Parent p=(Parent)session.load(Parent.class.pid);
Child c=(Child)p.getChildren().iterator().next();
p.getChildren.remove(c);
session.delete(c);
session.flush();

 

在我们的例子中,如果没有父对象,子对象就不应该存在,如果将子对象从Colletction中移除,实际上我们是想删除它。

要实现这种要求,就必须使用cascade="all-delete-orphen"。
注意:即使在Collection一方的映射中指定inverse="true",级联仍然是通过遍历Collection中的元素来处理的。如果你想
通过级联进行子对象的插入、删除、更新操作,就必须把它加载到Collection中,只调用setParent()是不够的。
当级联更新时,对象Parent包含了子对象的集合,由于打开了级联更新,Hibernate需要知道哪些Child对象是新实例化的,哪
些代表数据库中的记录。我们假设Parent和Child对象的标识符都是自动分配的,Hibernate是通过对象的标示属性的值和
version或timestamp属性来判断哪些子对象是新的。下面代码会更新Parent和child对象,并且插入newChild对象。
//parent and child where both loaded in a previous session
parent.addChild(child);//把父关联的子上,把子关联到父上.
Child newChild=new Child();
parent.addChild(newChild);
session.update(parent);
session.flush();
这对于自动分配标识符的情况是非常好的,但是要是自定义的,即id的子元素<generator class="assigned" />,这就比较麻
烦了,因为Hibernate没办法区分新实例化的对象(标识被用户指定了)和前一个Session装入的对象,在这种情况下,
Hibernate会使用timestamp或version属性,或者查询第二级缓存,或者使用最坏的情况,查询数据库,来确认是否存在此
行记录。

个人总结: 级联保存、删除,父类只加载自己就行了;但级联更新,父类要加载子类对象,这样它才好区分哪些对象是新实
例的,那些是需要更新的。
级联更新:第一次是保存,以后是更新,则
Parent p=(Parent)session.getCascade(Parent.class,pid);
if(p.getChildren().size()>0){
for(Iterator iter=p.getChildren().iterator();iter.hasNext();){
//若更新对象
Child c=(Child)iter.next();
c.setName("c");//获取子类信息
parent.addChild(child);//把父关联的子上,把子关联到父上.
}
}else{
Child c=new Child();
…… ……… …… ………
parent.addChild(child);//把父关联的子上,把子关联到父上.

}

分享到:
评论

相关推荐

    hibernate 级联查询

    “Hibernate 级联查询”是指在使用Hibernate这个Java持久化框架时,如何处理对象之间的关联查询。Hibernate提供了级联操作来简化数据的保存、更新和删除等操作,使得开发者无需手动编写复杂的SQL语句,就能实现关联...

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

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

    Hibernate级联操作一对多demo

    在Java持久化框架Hibernate中,级联操作是处理对象关系映射(ORM)时非常重要的一个特性。级联操作允许我们在对一个实体进行操作时,自动地影响与之相关的其他实体,无需显式地处理这些关联。在这个" Hibernate级联...

    hibernate级联增删改查

    在处理一对多、多对一等关联关系时,Hibernate提供了级联操作功能,使得对主表的增删改查能够自动影响到关联的从表。本主题将深入探讨"hibernate级联增删改查",特别是针对"t_card主表"和"t_person从表"的关系。 ...

    hibernate 级联(cascade和inverse)一对多

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

    3.3、Hibernate级联关系(Av839011656,P3).mp4

    3.3、Hibernate级联关系(Av839011656,P3).mp4

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

    本文将深入探讨如何在Hibernate中处理Many-to-Many关系的级联保存、级联更新和级联删除。 一、Many-to-Many关系基础 在数据库设计中,Many-to-Many关系意味着两个实体之间存在多对多的关系。例如,学生可以选修多门...

    Hibernate级联操作.docx

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

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

    在Java的持久化框架Hibernate中,级联操作是一种非常实用的功能,它允许我们在对一个对象进行操作时,自动处理与其关联的对象。级联删除(Cascade Delete)就是其中之一,当删除一个对象时,会根据配置自动删除与之...

    Hibernate的缓存级联查询

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

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

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

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

    在Java持久化框架Hibernate中,一对多(One-to-Many)、多对一(Many-to-One)、级联(Cascading)、加载(Loading)和反转(Inversing)是关系映射的重要概念,它们对于理解如何在数据库和对象之间有效地管理关联至...

    第七章_Hibernate_-_级联策略

    第七章_Hibernate_-_级联策略 第七章

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

    总的来说,这个项目展示了如何使用Hibernate、Ajax和DWR来实现一个高效、用户友好的省市县三级级联选择功能。开发过程中涉及了ORM、MVC架构、数据库操作以及前端交互等多个方面,是学习和实践Web开发技能的好实例。

    Ajax+struts+hibernate实现级联菜单

    Ajax+struts+hibernate实现级联菜单 Ajax+struts+hibernate实现级联菜单 Ajax+struts+hibernate实现级联菜单

    Hibernate cascade (级联).doc

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

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

    本文档主要讨论了使用Hibernate的HQL(Hibernate Query Language)进行级联查询时需要注意的一些事项。 1. 数据库模型 - `Employee`表:包含`id`(主键)、`empname`(员工姓名)、`empage`(员工年龄)、`context...

    hibernate3.2的级联关系_JavaProject

    本项目“hibernate3.2的级联关系_JavaProject”旨在帮助初学者理解并实践Hibernate 3.2中的级联关系,包括一对多、一对一和多对多这三种主要的关系类型。 首先,让我们深入了解一下级联关系。级联关系在Hibernate中...

    hibernate3.2级联关系自身一对多双向关联

    在Hibernate 3.2版本中,级联关系是处理对象间关联的重要特性,特别是自身一对多双向关联,这允许一个实体类实例与多个相同类型的其他实例相关联,而且这种关联是双向的。现在,让我们深入探讨这个主题。 首先,...

Global site tag (gtag.js) - Google Analytics