Hibernate: 设A引用了B,如果要先取A删A再取B删B,则删A后可能要evict(A.getB()),才能顺利删除B
否则,就会报错:a different object with the same identifier value was already associated with the session
原理是这样的:
第一步将A从数据库中取出时,它引用的B也从数据库中取出,两者同时成为持久化对象。A删除后,B是处于Session中的持久化对象
第二步中又显式地将B从数据库中取出,加上第一步中取出的B,Session里就有两个B了。这时侯如果删B,就会报上面所说的那种错误。
因此,应该在删除A后立即将它引用了的B从Session中清除掉。即:
A = Session.load(A);
Session.delete(A);
Session.evict(A.getB());
Session.delete(B);
===============================================
注意:evict()并不会级联,除非设置了相应的cascade
也就是说,如果B引用了C, evict(B)时不会自动evict(C)
看官方文档:
This operation cascades to associated instances if the association is mapped with cascade="all" or cascade="all-delete-orphan".
分享到:
相关推荐
在Hibernate框架中,Session是与数据库交互的主要接口,它提供了多种方法来操作对象的状态和数据。本文主要讨论了`get`、`load`方法以及`flush`、`clear`、`evict`等方法的区别。 首先,让我们关注`get`和`load`的...
Hibernate 工作原理及为什么要用 Hibernate 作为一个开放源代码的对象关系映射框架,对 JDBC 进行了轻量级的对象封装,使 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。下面将详细介绍 Hibernate 的...
在Hibernate ORM框架中,管理对象的状态和缓存是其核心功能之一。`evict()`和`clear()`方法都是用于管理Session缓存中的对象,但它们的作用和使用场景有所不同。理解这些概念对于优化Hibernate应用程序和避免潜在...
### 关于flush和evict在Hibernate中的应用 #### 一、引言 在持久层框架Hibernate中,`flush()`和`evict()`方法是开发者在处理数据时经常会遇到的两个重要概念。它们对于理解Hibernate的工作机制及其缓存管理至关...
14. **代理对象**:在使用懒加载时,Hibernate返回的实体对象可能是代理对象,只有在访问其属性时才会触发数据库查询。 总之,`hibernate-3.2`作为Java ORM的重要工具,它的功能强大,易于使用,极大地提高了开发...
然而,频繁的数据库交互可能导致性能下降,尤其是在高并发环境下。这就是EhCache发挥作用的地方。EhCache是一款开源的、高性能的内存缓存解决方案,它可以缓存对象,减轻数据库的压力,提高应用的响应速度。 首先,...
《Hibernate缓存机制详解》 Hibernate,作为Java领域中广泛使用的对象关系映射(ORM)框架,极大地简化了数据库操作。其缓存机制是优化性能的关键组成部分,它减少了对数据库的直接访问,提高了数据处理效率。本文...
在Java的持久化框架Hibernate中,一级缓存是其核心特性之一,它是Session级别的缓存,也称为事务级缓存。一级缓存的作用是提高数据访问效率,减少对数据库的直接访问,从而提升应用程序的性能。当我们在Hibernate中...
Hibernate框架是Java开发中广泛使用的对象关系映射(ORM)工具,它允许开发者将数据库操作与业务逻辑解耦,通过面向对象的方式处理数据。Hibernate简化了数据库操作,减少了手动编写SQL语句的需求,提高了开发效率。...
2. 状态转换:瞬时态通过Session的save()或persist()成为持久态,持久态对象在Session关闭后变为脱管态,而Session的clear()或evict()会将持久态对象变为脱管态。 3. 一对多配置:返回的是一个集合,集合中的元素...
- 在一个事务中,尽可能地将相关的操作组合在一起,避免中间插入不必要的`flush`。 - 如果需要在事务外操作Session,确保正确管理并发,避免多个线程共享同一个Session。 - 使用`saveOrUpdate`方法代替单独的`save`...
过大可能导致内存溢出,过小则可能频繁读写数据库。 2. **及时清理无用对象**:通过调用Session的evict()方法,可以主动从一级缓存中移除不再需要的对象,避免内存浪费。 3. **控制事务粒度**:一级缓存是按会话划分...
Hibernate是一款强大的对象关系映射(ORM)框架,它在Java应用中起到了桥梁的作用,使得开发者可以使用面向对象的方式来操作数据库,而无需直接编写SQL语句。这个“Hibernate帮助文档”是一个CHM格式的综合指南,...
然而,由于`evict()`操作将`cat`从`entityEntries`中移除,但在事务提交时(即Flush操作时),Hibernate无法找到`cat`对象的引用,从而导致`AssertionFailure`异常,提示可能的非线程安全访问或不正确的Session使用...
### Hibernate缓存机制及优化策略 #### 一、概述 Hibernate作为一款优秀的对象关系映射(ORM)框架,在Java开发领域被广泛应用于数据库操作。它提供了丰富的缓存机制来提高应用性能并降低数据库访问压力。本文将...
1. **Session 缓存**:这是 Hibernate 自动管理的一级缓存,可以通过 Session 的 `clear()` 或 `evict()` 方法手动清理缓存。在执行大量数据插入或更新操作时尤为重要。 2. **二级缓存**:二级缓存是在 ...
2. **Session缓存管理**:手动清除Session缓存(`session.evict()`或`session.clear()`),特别是在执行大量数据插入或更新操作后,防止内存溢出。 3. **应用缓存**:配置合理的缓存策略,如readOnly、nonstrict-...