首先,hibernate中的二级缓存分2块,第一块是modal的class中设置,第二块是set中设置,根据测试来看,缓存在set中的内容并非是整个子对象的set,而是子对象的ID的set集合,因此当子对象有变动时候,缓存中set里该子对象拿出来也会更新,而当子对象自己删除并没有通知到主对象的时候就会发生缓存不同步的问题,也就是主对象的set中还存在子对象的ID,但是子对象实际已经删除了,这个时候hibernate会报缓存找不到子对象的错误,因此遇到这种情况,在处理子对象之前必须把主对象set中该子对象remove掉,这样缓存就同步了。
再放一个hbm.xml例子吧,这里的主对象就是Month,子对象是Thing。set是Thing的集合。如果开启了hibernate二级缓存后只删除了子对象某Thing,而不去在该Thing的Month对象的Set集合中把自己给remove掉就会出现上面描述的错误。
解决方法就是在删除该Thing前去取下该Thing的Month对象下的Set集合,把这个集合中该Thing对象reomve后再删除该Thing。
PS:要用二级缓存必须在class和set中加入<cache>标签
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.myweb.modal.hibernate"> <class name="Month" table="month" catalog="myweb"> <cache usage="nonstrict-read-write" region="Month"/> <id name="id" type="java.lang.Integer"> <column name="id" /> <generator class="native" /> </id> <property name="name" type="java.lang.String"> <column name="name" length="20" not-null="true" /> </property> <property name="total" type="java.lang.Float"> <column name="total"/> </property> <many-to-one name="creater" column="creater_id" class="Creater" cascade="all" unique="true"></many-to-one> <set name="things" inverse="true" lazy="false" cascade="all-delete-orphan"> <cache usage="nonstrict-read-write" region="Month.things"/> <key column="monthid"/> <one-to-many class="Thing"/> </set> </class> </hibernate-mapping>
相关推荐
缓存机制分为一级缓存和二级缓存,两者都有助于减少对物理数据库的直接访问,从而提高应用程序的运行效率。 一级缓存是 Hibernate 内置的,默认开启,与 Session 对象关联。它是一个事务范围的缓存,也就是说,每个...
本篇文章将深入探讨Hibernate的二级缓存机制,以及如何进行一级缓存与二级缓存的同步,同时还会介绍二级缓存的配置文件设置。 一级缓存是Hibernate默认提供的缓存,每个SessionFactory实例都有一个一级缓存。当对象...
**hibernate一级缓存、二级缓存和查询缓存** 在Java的持久化框架Hibernate中,缓存机制是提高应用程序性能的关键要素。缓存能够减少数据库的访问次数,提高数据读取速度,并且在一定程度上降低了系统的负载。本文将...
标题“Hibernate一级缓存和二级缓存”指的是Hibernate框架中的两种缓存机制,它们是提高数据访问性能的关键要素。一级缓存是Session级别的,而二级缓存是SessionFactory级别的,两者在数据库操作中起到了重要的作用...
在 Hibernate 中,二级缓存和查询缓存是提高应用性能的重要机制。下面将详细介绍如何开启并理解这两个缓存机制。 ### 1. 一级缓存与二级缓存 #### 1.1 一级缓存 一级缓存是 Hibernate 内置的 Session 缓存,它是每...
Hibernate二级缓存是Java开发中使用Hibernate框架进行数据持久化时优化性能的一种重要技术。它在一级缓存(Session级别的缓存)的基础上,提供了一个全局的、跨会话的数据存储层,可以显著减少对数据库的访问,从而...
综上所述,通过学习`hibernate二级缓存示例源码`,我们可以了解到如何在实际项目中配置和使用Hibernate二级缓存,从而提升系统的性能。在实际应用中,应结合具体场景选择合适的缓存策略,以达到最佳的性能优化效果。
通过理解和运用Hibernate的二级缓存,我们可以优化应用性能,减少数据库压力,但同时也需要注意缓存可能带来的问题,如数据一致性、内存管理和并发控制等。在实际项目中,结合业务需求和系统特点,合理配置和管理...
2. **写操作**:更新或删除操作后,Hibernate不仅会更新数据库,还会同步更新一级缓存和二级缓存中的数据,以保持一致性。 3. **查询优化**:在进行批量查询时,如果某个对象已经在二级缓存中,Hibernate会直接从...
二级缓存是 Hibernate 缓存策略的一部分,它在应用程序的多个会话之间共享数据,进一步优化了数据库访问效率。 二级缓存分为以下关键知识点: 1. **一级缓存与二级缓存的区别**: - 一级缓存:每个 Hibernate ...
描述部分提到的“博文链接:https://zhaoshijie.iteye.com/blog/998230”虽然没有提供具体信息,但可以推断出这是一个完整的博客文章,其中详细阐述了关于Hibernate二级缓存的使用和实现,可能包括了配置、注解的...
这个标题表明我们将探讨一个具体的应用示例,即如何在Hibernate4框架中实现实现二级缓存,并且提供了源码供参考。Hibernate是一个流行的Java对象关系映射(ORM)框架,它允许开发者使用面向对象的方式来操作数据库。...
在Java的持久化框架Hibernate中,二级缓存是提高数据访问效率的重要机制。它能够将经常访问的数据存储在服务器内存中,减少对数据库的直接访问,从而提升系统性能。本篇将详细介绍Hibernate二级缓存的概念、作用以及...
Hibernate 二级缓存是 ORM 框架 Hibernate 中的一个重要特性,它旨在提高应用程序的性能和数据一致性。二级缓存允许对象在多个会话之间共享,从而减少了对数据库的访问次数,降低了系统的 I/O 负担。在这个主题中,...
本文将深入探讨Hibernate的一级缓存和二级缓存,以及二级缓存的数据存储结构。 首先,一级缓存是Hibernate默认提供的缓存,每个Session都有一个独立的一级缓存。当我们在操作数据库时,例如查询或更新记录,这些...
Hibernate缓存主要分为一级缓存和二级缓存: 1. **一级缓存(Session级别)**:每个Hibernate Session都拥有自己的缓存,也称为事务级缓存。当对象被持久化时,会自动放入一级缓存,同一会话内多次查询相同对象只会...
文档"Hibernate_二级缓存总结 开发技术 - Java.doc"可能详细阐述了如何配置和使用Hibernate的二级缓存,包括配置文件的设置、缓存提供者的选用、实体和集合的缓存配置,以及实战中的优化技巧。阅读该文档将有助于...
启用二级缓存后,我们还需要注意缓存同步的问题,特别是在并发环境下,需要确保在多线程或多进程操作时,缓存与数据库之间的数据一致性。此外,对于经常变化或不常访问的数据,应谨慎选择是否放入缓存,以避免因缓存...