`
ghsea
  • 浏览: 111876 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

级联策略

阅读更多
    Session的文档中将一个对象的状态分为三种:
transient: never persistent, not associated with any Session(临时态)
persistent: associated with a unique Session(持久态)
detached(分开的,分离的): previously persistent, not associated with any Session
下面给出了一个对象的从一个临时态到数据库的过程:
     临时态(一块单独的内存)——>持久态(Session的内存)——>永久性数据(数据库)
    
    对于第一种,通常是我们通过new得到的对象,它与任何Session均无关系,对于第二种,是与一个Session相关联的对象,如被Session执行save()后的对象(但是还没有被commit()到数据库中),第三种,是以前曾被持久化的,但是与
Session解除关系了的。
看这样一个实例,其映射文件如下
  1. <hibernate-mapping>  
  2.     <class name="hello.Message" table="message">  
  3.        <id name="id" column="id">  
  4.          <generator class="native"/>  
  5.        </id>  
  6.          
  7.        <property name="text" column="text"/>  
  8.        <many-to-one name="nextMessage"   column="next_id" />  
  9.          
  10.     </class>  
  11. </hibernate-mapping>  
   
 在进行实验时,数据库的表中有样的记录:
  1.    +------+---------------------------+------------
       |id    |        text               |next_id    |
       +------+---------------------------+-----------+
       |2     |      Greeting             |  4        |
       |4     |   take me to your leader  |  null     |
       +------+---------------------------+-----------+


1.级联保存和更新:
  代码A
  1. Message ms=(Message)session.load(Message.classnew Long(2));  
  2. ms.setText("Greeting");  
  3. Message m=new Message("take me to your leader");  
  4. ms.setNextMessage(m);  
  5. //session.save(m);  
  6. tx.commit();  
  7. session.close();  
      
       我们已经知道,Session执行save(),delete()等方法只是改变与从Session中删除或向Session中保存对象,而commit()是根据Session的状态执行向数据库的持久化工作。为证明这一点,我们执行以下操作:
代码B
  1. Message ms=(Message)session.load(Message.classnew Long(4));     
  2.  session.delete(ms);      
  3. //tx.commit();     
  4.  session.close();   

其结果为:
  1. Hibernate: select message0_.id as id0_0_, message0_.text as text0_0_,
  2. message0_.next_id as next3_0_0_ from message message0_ where message0_.id=?  
把注释取消,结果打印出异常
  1. Cannot delete or update a parent row: a foreign key constraint fails (`test/message`,
  2.  CONSTRAINT `FK_message_1` FOREIGN KEY (`next_id`) REFERENCES `message` (`id`))  
      可见,在未
commit()时,Hibernate并未执行数据库操作。
      那么现在我们知道了,对于代码A,由于未执行
session.save(m),对象m还只是一个临时对象,它还不能被保存到数据库中因此执行代码A后会抛出异常:org.hibernate.TransientObjectException,它表示tx在执行将ms保存到数据库时,需要同时保存m到数据库中,但是m是一个临时对象,这时我们有两种解决方法:
A.在配置文件中将cascade设为save-update,那么tx在保存ms时会级联保存临时对象
m
B.取消注释,显式地持久化
m

2.、级联删除:
   映射如下
  1. <many-to-one name="nextMessage"  cascade="delete"  column="next_id" />    
执行以下操作:
  1. Message ms=(Message)session.load(Message.classnew Long(2));     session.delete(ms);      
  2. //tx.commit();     
  3. session.close();   
执行结果为:
  1. Hibernate: select message0_.id as id0_0_, message0_.text as text0_0_,
  2.          message0_.next_id as next3_0_0_ from message message0_ where message0_.id=?  
  3. Hibernate: delete from message where id=?  
  4. Hibernate: delete from message where id=?  
      注意到了级联的方向吗?代码B在取消注释后即使不用级联,都会抛出异常,这是由外键约束决定的。考虑Customer和Order的实例,当删除
Customer时,我们可以而且应该级联删除Order,这是合理的,但是如果想删除一个作为Customer外键的Order是当然不行的。
  
    最后Hibernate默认不产生级联行为。
分享到:
评论

相关推荐

    第七章_Hibernate_-_级联策略

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

    JPA中的一对多双向关联与级联操作

    在Java世界中,Java Persistence API (JPA) 是一种用于管理关系数据库的框架,它使得对象-关系映射(ORM)变得更加...在实际项目中,应根据具体业务场景选择合适的关联类型和级联策略,以确保数据的完整性和一致性。

    电信设备-级联信息处理的方法及终端.zip

    5. **级联策略**:不同的级联策略会影响系统的表现。例如,根据信道条件选择合适的编码和解码方式,或者动态调整级联单元的工作参数,以适应网络环境的变化。 6. **性能评估与优化**:文档可能包含对级联信息处理...

    Spring+Hibernate一对多关联映射---部门与员工表的级联添加

    然后,在Hibernate的映射文件中,为这个集合添加`&lt;set&gt;`标签,指定关联的实体类、外键字段以及级联策略。级联策略(cascade)可以设置为"save-update",这样在保存或更新部门时,其包含的员工也会被同步处理。 ```...

    10_传智播客JPA详解_JPA中的一对多双向关联与级联操作

    3. 级联操作详解:阐述各种级联类型的含义和使用场景,以及如何在实体上设置级联策略。 4. 示例代码解析:提供具体的代码示例,展示如何在实体类中定义关联,并进行增删改查操作。 5. 性能优化建议:讨论如何通过...

    Hibernate cascade (级联).doc

    ### Hibernate级联(Cascade)详解 #### 一、概述 Hibernate 是一款强大的对象关系映射 (ORM) 框架,它允许开发人员将 Java 对象模型映射到数据库表,从而极大...因此,在实际应用中应根据具体需求谨慎选择级联策略。

    cas.rar_MATLAB 级联失效_级联_级联失效 代码_级联失效代码_级联失效算法

    "级联失效代码"是实际的程序源码,可能包括了各种算法,如故障传播模型、网络拓扑分析、负载平衡策略等,以模拟不同条件下的失效传播。"级联失效算法"则是指用于预测和控制级联失效的特定方法,这些算法通常基于数学...

    一种面向自动驾驶汽车的非线性纵向级联控制策略.pdf

    "一种面向自动驾驶汽车的非线性纵向级联控制策略" 摘要:本文提出了一种面向自动驾驶汽车的非线性纵向级联控制策略,以确保自动驾驶汽车在多弯道状态下安全行驶。该策略通过设计纵向控制的外循环控制策略和混合横向...

    Hibernate 删除出现异常的解决方案.doc

    这个异常通常发生在试图删除的对象与其他对象之间存在级联关系(cascade),而Hibernate的级联策略不允许被删除的对象再次被保存。以下是三种常见的解决方法: 1. **删除Set方的级联(Cascade)** 当两个对象之间...

    级联字典的构造

    级联字典是一种在计算机科学和信号处理领域中常见的数据结构,特别是在图像处理、压缩编码和机器学习等应用中。...其广泛应用于图像处理、压缩编码和机器学习等领域,未来的研究将继续探索其潜在的应用价值和优化策略。

    Spring+Hibernate 多对多关联映射---教师与学生表的级联增删改查

    - 级联操作需谨慎,`CascadeType.ALL`可能导致数据误删,可以根据实际需求选择合适的级联策略。 - 中间表的维护应遵循数据库的一致性规则,避免出现冗余或丢失关联数据。 综上所述,这个小例子展示了如何在Spring...

    大规模深度学习在动态结构中的应用.pdf

    在谷歌的街景视图地址编号识别中,这种两步级联策略被成功应用,第一步定位地址编号,第二步进行具体字符识别。 总的来说,动态结构和级联分类器在大规模深度学习中的应用,是提高计算效率和优化资源分配的有效手段...

    基于H桥级联型五电平逆变器的Matlab仿真分析_???h??_逆变器_逆变器MATLAB_Hqiao级联五电平_级联H桥

    Hqiao级联五电平逆变器的Matlab仿真分析不仅涉及硬件设计,还涵盖了控制策略的研究。控制策略的选择对逆变器的性能至关重要,例如,可以选择空间矢量脉宽调制(SVPWM)等高级调制技术,以进一步优化输出波形并降低...

    mysql级联更新和级联删除

    ### MySQL级联更新与级联删除详解 在数据库设计中,外键约束是维护数据完整性和一致性的重要手段之一。...在实际应用中,应根据业务需求选择合适的策略,并注意测试各种边界情况,确保系统的稳定运行。

    casForest-master_级联森林_

    在级联森林中,每个阶段的决策树可能会有不同的构建策略,如随机特征选择、不均匀划分等,以增加模型的多样性。 随机森林与级联森林的联系: 随机森林也是一种集成学习方法,由多棵决策树组成。每棵树在构建时都...

    SQL Server2008中级联的实现原理探讨——以触发器为例.pdf

    在实际应用中,应充分考虑性能、可维护性和业务需求,选择最适合的级联策略。 总结来说,SQL Server 2008的级联机制是通过参照完整性和触发器来确保数据一致性。理解这两种方法的原理和优缺点,有助于我们在设计...

    react级联选择器/支持多选/单选

    7. **优化与性能**:对于大型数据集,可能需要采用懒加载策略,只在需要时加载下一层数据,减少初始渲染的开销。此外,使用PureComponent或React.memo可以避免不必要的重渲染。 8. **无障碍性(Accessibility)**:...

Global site tag (gtag.js) - Google Analytics