hibernate缓存不解

问题描述

大家看一下这段代码SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();Session s = sessionFactory.openSession();s.beginTransaction();for(int i=0;i<10;i++){ Cat cat = new Cat(); cat.setWeight(20.1f); cat.setName("cat_"+i);//此处改变了name属性的值,即使不改变,我也要求它插入新的十条数据 s.save(cat);}s.getTransaction().commit();映射文件:Cat.hbm.xml<hibernate-mapping> <class name="org.hibernate.entity.Cat" table="CAT"> <!-- A 32 hex character is our surrogate key. It's automatically generated by Hibernate with the UUID pattern. --> <id name="id" type="string" unsaved-value="null" > <column name="CAT_ID" sql-type="char(32)" not-null="true"/> <generator class="uuid.hex"/> </id> <!-- A cat has to have a name, but it shouldn' be too long. --> <property name="name"> <column name="NAME" length="16" not-null="true"/> </property> <property name="sex"/> <property name="weight"/><!-- --> </class></hibernate-mapping>第一次执行插入操作时, i 的范围是从0到10,执行没有问题,向数据库中插入了十条正确的数据。当第二次执行插入操作时,将 i 的范围改为从10到20,执行没有问题,但此次操作的结果“看起来”仅仅是对前面的数据进行修改,因为仅仅改变了其name属性的值,其他的没有改变,而不是重新插入,这是为什么呢?也许是由于映射文件中对CAT_ID的设置有问题吗?问题补充肉嘎嘎 写道

解决方案

是不是在cfg配置文件中,配置了<property name="hibernate.hbm2ddl.auto">create</property>!
解决方案二:
还有一点 就是你第一次运行完后应该没有存入数据库吧,只是在缓存中存在,当你运行第二次时,其实第一次的就不存在了,第二次是新的开始,所以还是没有存入数据库中。不知道对不对。
解决方案三:
应为此时的hibernate状态还是处于持久化状态,你没关闭session,缓存也没刷新,也不算是更新,只是session里面的缓存对象修改了,你在后面加个session.flush()试试,或者session.close()
解决方案四:
你第一次save过后把缓存手动flush并且清空一次再调用一下这个方法试试呢?
解决方案五:
xiexifeng113 写道肉嘎嘎 写道为什么是修改,LZ说的修改是update吗?,你的代码上怎么没看出来有什么修改的啊?顶多就是又新增了10条数据!不解?另外,对于save方法来说,当第一次持久化对象的时候,对象状态是从零时状态到了持久状态,这样数据库中存在了相应的记录(前10条记录),并且在缓存中保存了这10个对象和数据的快照,当你修改了循环次数,再次执行此方法的时候,由于你的属性没有任何改变,因此缓存快照的对象数据和你新创建的对象数据是一致的,所以在提交的时候,仅会对原有的数据重新做insert操作!个人的分析,如有错误,请牛人指出,谢谢!~~~~~~我的name属性已经发生了变化,即使没有发生变化,我执行的插入操作,它也应该给我执行插入操作!也许是某个设置上有问题,但一直没有找到解法为什么没有变化也应该做插入操作呢?能说一下你的理由吗?
解决方案六:
看看你的save是怎么实现的
解决方案七:
为什么是修改,LZ说的修改是update吗?,你的代码上怎么没看出来有什么修改的啊?顶多就是又新增了10条数据!不解?另外,对于save方法来说,当第一次持久化对象的时候,对象状态是从零时状态到了持久状态,这样数据库中存在了相应的记录(前10条记录),并且在缓存中保存了这10个对象和数据的快照,当你修改了循环次数,再次执行此方法的时候,由于你的属性没有任何改变,因此缓存快照的对象数据和你新创建的对象数据是一致的,所以在提交的时候,仅会对原有的数据重新做insert操作!个人的分析,如有错误,请牛人指出,谢谢!~~~~~~

时间: 2024-10-07 19:59:56

hibernate缓存不解的相关文章

mybatis缓存和hibernate缓存的理解问题和区别。类缓存和查询缓存的理解和区别

问题描述 mybatis缓存和hibernate缓存的理解问题和区别.类缓存和查询缓存的理解和区别 Hibernate的一级缓存的目的是为了方便管理实体类的状态(临时状态.持久化状态.游离状态.删除状态).Hibernate的目的二级缓存是为了减少sql语句.那么mybatis的一级缓存和二级缓存的目的是为了什么? Hibernate的二级缓存通常使用ehcache,通常配置的是实体类,所以ehcache里面配置实体类是属于类缓存吗? 类缓存到底在什么地方优化?怎样减少sql语句? 查询缓存到底

【转 :Hibernate 缓存机制】

转自:http://www.cnblogs.com/wean/archive/2012/05/16/2502724.html Hibernate 缓存机制   一.why(为什么要用Hibernate缓存?) Hibernate是一个持久层框架,经常访问物理数据库. 为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能. 缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据.   二.what(Hibernate缓

Hibernate缓存

Hibernate缓存在工作面试的时候很可能会遇到的问题. 缓存其实就是一块内存空间,充当数据库的内存中的一个临时的容器. 一:hibernate缓存是怎样的?    Hibernate缓存提供了两种缓存:一级缓存和二级缓存. 1 一级缓存又称事务级缓存,Session的缓存.     在Hibernate中一级缓存存是基于Session的生命周期实现的,每一个Session会在内部维护一个数据缓存,她随着Session的创建而创建,销毁而销毁.     一级缓存是必须的,在同一个一级缓存中,每

JAVA Hibernate缓存详解

1.缓存介绍 Hibernate中提供了两级Cache,第一级别的缓存是Session级别的缓存,它是属于事务范围的缓存.这 一级别的缓存由hibernate管理的,一般情况下无需进行干预:第二级别的缓存是SessionFactory级别的 缓存,它是属于进程范围或群集范围的缓存.这一级别的缓存可以进行配置和更改,并且可以动态加载和 卸载. Hibernate还为查询结果提供了一个查询缓存,它依赖于第二级缓存. 一. 一级缓存和二级缓存的比较: 第一级缓存和第二级缓是存放数据的形式是以相互关联的

语言教程学堂:hibernate缓存机制详细分析

在本篇随笔里将会分析一下hibernate的缓存机制,包括一级缓存(session级别).二级缓存(sessionFactory级别)以及查询缓存,当然还要讨论下我们的N+1的问题. 随笔虽长,但我相信看完的朋友绝对能对hibernate的 N+1问题以及缓存有更深的了解. 一.N+1问题 首先我们来探讨一下N+1的问题,我们先通过一个例子来看一下,什么是N+1问题: list()获得对象: /** * 此时会发出一条sql,将30个学生全部查询出来 */ List<Student> ls =

第十二章 hibernate缓存

1.一级缓存(Session级缓存) 一级缓存很短和session的生命周期一致,因此也叫session级缓存或事务级缓存 那些方法支持一级缓存: *get() *load() *iterate(查询实体对象) 如何管理一级缓存: *session.clear(),session.evict() 如何避免一次性大量的实体数据入库导致内存溢出 方法1:先flush,再clear for(int i = 0; i <1000000; i++){ session.save(user); if(i %

Hibernate缓存和ehcache

缓存的概念          计算机领域非常通用的概念.它介于应用程序和永久性数据存储源(如硬盘上的文件或者数据库)之间,其作用是降低应用程序直接读写永久性数据存储源的频率,从而提高应用的运行性能.缓存中的数据是存储源总的数据的拷贝.缓存的物理介质通常是内存.   Hibernate中提供了两个级别的缓存          Session级别的缓存          它是属于事务范围的缓存.这一级别的缓存有Hibernate管理的,一般情况下午需进行干预.          SessionFac

hibernate 缓存-hibernate查询数据库与缓存开启时机

问题描述 hibernate查询数据库与缓存开启时机 关于hibernate在第一次查询数据库的时候,是否开启缓存,及开启缓存的时机,使用的缓存是以及还是二级,请详情说明下,万分感谢!!!

Hibernate缓存同步问题

问题描述 环境: OS : Win XP SP2 Hibernate: 3.5.1伪代码: System.out.println(StringUtils.center("query 查询: " )); Session session = HibernateSessionFactory.getSession(); String hql = "FROM Room T WHERE T.address = ?"; Query query = session.createQu