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解除关系了的。
看这样一个实例,其映射文件如下
- <hibernate-mapping>
- <class name="hello.Message" table="message">
- <id name="id" column="id">
- <generator class="native"/>
- </id>
-
- <property name="text" column="text"/>
- <many-to-one name="nextMessage" column="next_id" />
-
- </class>
- </hibernate-mapping>
在进行实验时,数据库的表中有样的记录:
- +------+---------------------------+------------
|id | text |next_id |
+------+---------------------------+-----------+
|2 | Greeting | 4 |
|4 | take me to your leader | null |
+------+---------------------------+-----------+
1.级联保存和更新:
代码A
- Message ms=(Message)session.load(Message.class, new Long(2));
- ms.setText("Greeting");
- Message m=new Message("take me to your leader");
- ms.setNextMessage(m);
-
- tx.commit();
- session.close();
我们已经知道,Session执行save(),delete()等方法只是改变与从Session中删除或向Session中保存对象,而
commit()是根据Session的状态执行向数据库的持久化工作。为证明这一点,我们执行以下操作:
代码B
- Message ms=(Message)session.load(Message.class, new Long(4));
- session.delete(ms);
-
- session.close();
其结果为:
- Hibernate: select message0_.id as id0_0_, message0_.text as text0_0_,
- message0_.next_id as next3_0_0_ from message message0_ where message0_.id=?
把注释取消,结果打印出异常
- Cannot delete or update a parent row: a foreign key constraint fails (`test/message`,
- CONSTRAINT `FK_message_1` FOREIGN KEY (`next_id`) REFERENCES `message` (`id`))
可见,在未ms保存到数据库时,需要同时保存m到数据库中,但是m是一个临时对象,这时我们有两种解决方法:
A.在配置文件中将cascade设为save-update,那么tx在保存ms时会级联保存临时对象 映射如下
分享到:
相关推荐
第七章_Hibernate_-_级联策略 第七章
在Java世界中,Java Persistence API (JPA) 是一种用于管理关系数据库的框架,它使得对象-关系映射(ORM)变得更加...在实际项目中,应根据具体业务场景选择合适的关联类型和级联策略,以确保数据的完整性和一致性。
5. **级联策略**:不同的级联策略会影响系统的表现。例如,根据信道条件选择合适的编码和解码方式,或者动态调整级联单元的工作参数,以适应网络环境的变化。 6. **性能评估与优化**:文档可能包含对级联信息处理...
然后,在Hibernate的映射文件中,为这个集合添加`<set>`标签,指定关联的实体类、外键字段以及级联策略。级联策略(cascade)可以设置为"save-update",这样在保存或更新部门时,其包含的员工也会被同步处理。 ```...
3. 级联操作详解:阐述各种级联类型的含义和使用场景,以及如何在实体上设置级联策略。 4. 示例代码解析:提供具体的代码示例,展示如何在实体类中定义关联,并进行增删改查操作。 5. 性能优化建议:讨论如何通过...
### Hibernate级联(Cascade)详解 #### 一、概述 Hibernate 是一款强大的对象关系映射 (ORM) 框架,它允许开发人员将 Java 对象模型映射到数据库表,从而极大...因此,在实际应用中应根据具体需求谨慎选择级联策略。
"级联失效代码"是实际的程序源码,可能包括了各种算法,如故障传播模型、网络拓扑分析、负载平衡策略等,以模拟不同条件下的失效传播。"级联失效算法"则是指用于预测和控制级联失效的特定方法,这些算法通常基于数学...
"一种面向自动驾驶汽车的非线性纵向级联控制策略" 摘要:本文提出了一种面向自动驾驶汽车的非线性纵向级联控制策略,以确保自动驾驶汽车在多弯道状态下安全行驶。该策略通过设计纵向控制的外循环控制策略和混合横向...
这个异常通常发生在试图删除的对象与其他对象之间存在级联关系(cascade),而Hibernate的级联策略不允许被删除的对象再次被保存。以下是三种常见的解决方法: 1. **删除Set方的级联(Cascade)** 当两个对象之间...
级联字典是一种在计算机科学和信号处理领域中常见的数据结构,特别是在图像处理、压缩编码和机器学习等应用中。...其广泛应用于图像处理、压缩编码和机器学习等领域,未来的研究将继续探索其潜在的应用价值和优化策略。
- 级联操作需谨慎,`CascadeType.ALL`可能导致数据误删,可以根据实际需求选择合适的级联策略。 - 中间表的维护应遵循数据库的一致性规则,避免出现冗余或丢失关联数据。 综上所述,这个小例子展示了如何在Spring...
在谷歌的街景视图地址编号识别中,这种两步级联策略被成功应用,第一步定位地址编号,第二步进行具体字符识别。 总的来说,动态结构和级联分类器在大规模深度学习中的应用,是提高计算效率和优化资源分配的有效手段...
Hqiao级联五电平逆变器的Matlab仿真分析不仅涉及硬件设计,还涵盖了控制策略的研究。控制策略的选择对逆变器的性能至关重要,例如,可以选择空间矢量脉宽调制(SVPWM)等高级调制技术,以进一步优化输出波形并降低...
### MySQL级联更新与级联删除详解 在数据库设计中,外键约束是维护数据完整性和一致性的重要手段之一。...在实际应用中,应根据业务需求选择合适的策略,并注意测试各种边界情况,确保系统的稳定运行。
在级联森林中,每个阶段的决策树可能会有不同的构建策略,如随机特征选择、不均匀划分等,以增加模型的多样性。 随机森林与级联森林的联系: 随机森林也是一种集成学习方法,由多棵决策树组成。每棵树在构建时都...
在实际应用中,应充分考虑性能、可维护性和业务需求,选择最适合的级联策略。 总结来说,SQL Server 2008的级联机制是通过参照完整性和触发器来确保数据一致性。理解这两种方法的原理和优缺点,有助于我们在设计...
7. **优化与性能**:对于大型数据集,可能需要采用懒加载策略,只在需要时加载下一层数据,减少初始渲染的开销。此外,使用PureComponent或React.memo可以避免不必要的重渲染。 8. **无障碍性(Accessibility)**:...