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>
&lt;class name="org.hibernate.entity.Cat" table="CAT"&gt;

    &lt;!-- A 32 hex character is our surrogate key. It's automatically
        generated by Hibernate with the UUID pattern. --&gt;
    &lt;id name="id" type="string" unsaved-value="null" &gt;
        &lt;column name="CAT_ID" sql-type="char(32)" not-null="true"/&gt;
        &lt;generator class="uuid.hex"/&gt;
    &lt;/id&gt;

    &lt;!-- A cat has to have a name, but it shouldn' be too long. --&gt;
    &lt;property name="name"&gt;
        &lt;column name="NAME" length="16" not-null="true"/&gt;
    &lt;/property&gt;

    &lt;property name="sex"/&gt;

    &lt;property name="weight"/&gt;&lt;!--  --&gt;

&lt;/class&gt;

</hibernate-mapping>

第一次执行插入操作时, i 的范围是从0到10,执行没有问题,向数据库中插入了十条正确的数据。
当第二次执行插入操作时,将  i  的范围改为从10到20,执行没有问题,
但此次操作的结果“看起来”仅仅是对前面的数据进行修改,因为仅仅改变了其name属性的值,其他的没有改变,而不是重新插入,这是为什么呢?也许是由于映射文件中对CAT_ID的设置有问题吗?
问题补充
肉嘎嘎 写道
为什么是修改,LZ说的修改是update吗?,你的代码上怎么没看出来有什么修改的啊?顶多就是又新增了10条数据!不解?

另外,对于save方法来说,当第一次持久化对象的时候,对象状态是从零时状态到了持久状态,这样数据库中存在了相应的记录(前10条记录),并且在缓存中保存了这10个对象和数据的快照,当你修改了循环次数,再次执行此方法的时候,由于你的属性没有任何改变,因此缓存快照的对象数据和你新创建的对象数据是一致的,所以在提交的时候,仅会对原有的数据重新做insert操作!

个人的分析,如有错误,请牛人指出,谢谢!~~~~~~

我的name属性已经发生了变化,即使没有发生变化,我执行的插入操作,它也应该给我执行插入操作!也许是某个设置上有问题,但一直没有找到解法
问题补充
amwiacel 写道
看看你的save是怎么实现的

兄弟,没用过hibernate吧!
问题补充
肉嘎嘎 写道
xiexifeng113 写道
肉嘎嘎 写道
为什么是修改,LZ说的修改是update吗?,你的代码上怎么没看出来有什么修改的啊?顶多就是又新增了10条数据!不解?

另外,对于save方法来说,当第一次持久化对象的时候,对象状态是从零时状态到了持久状态,这样数据库中存在了相应的记录(前10条记录),并且在缓存中保存了这10个对象和数据的快照,当你修改了循环次数,再次执行此方法的时候,由于你的属性没有任何改变,因此缓存快照的对象数据和你新创建的对象数据是一致的,所以在提交的时候,仅会对原有的数据重新做insert操作!

个人的分析,如有错误,请牛人指出,谢谢!~~~~~~

我的name属性已经发生了变化,即使没有发生变化,我执行的插入操作,它也应该给我执行插入操作!也许是某个设置上有问题,但一直没有找到解法


为什么没有变化也应该做插入操作呢?能说一下你的理由吗?

你好好看一下主帖嘛!难道我没说明白。我是说执行之后的结果,仅仅是修改了name的值,其他的没有变化,包括id。而我确实是需要进行插入操作。两次执行完之后,数据库的表中应该有20条数据,即对应的name值从cat_0到cat_19,而现在表中只有十条数据cat_10到cat_19。希望后来的人能看明白。

7个回答

是不是在cfg配置文件中,配置了create!

为什么是修改,LZ说的修改是update吗?,你的代码上怎么没看出来有什么修改的啊?顶多就是又新增了10条数据!不解?

另外,对于save方法来说,当第一次持久化对象的时候,对象状态是从零时状态到了持久状态,这样数据库中存在了相应的记录(前10条记录),并且在缓存中保存了这10个对象和数据的快照,当你修改了循环次数,再次执行此方法的时候,由于你的属性没有任何改变,因此缓存快照的对象数据和你新创建的对象数据是一致的,所以在提交的时候,仅会对原有的数据重新做insert操作!

个人的分析,如有错误,请牛人指出,谢谢!~~~~~~

看看你的save是怎么实现的

[quote="xiexifeng113"][quote="肉嘎嘎"]为什么是修改,LZ说的修改是update吗?,你的代码上怎么没看出来有什么修改的啊?顶多就是又新增了10条数据!不解?

另外,对于save方法来说,当第一次持久化对象的时候,对象状态是从零时状态到了持久状态,这样数据库中存在了相应的记录(前10条记录),并且在缓存中保存了这10个对象和数据的快照,当你修改了循环次数,再次执行此方法的时候,由于你的属性没有任何改变,因此缓存快照的对象数据和你新创建的对象数据是一致的,所以在提交的时候,仅会对原有的数据重新做insert操作!

个人的分析,如有错误,请牛人指出,谢谢!~~~~~~[/quote]
我的name属性已经发生了变化,即使没有发生变化,我执行的插入操作,它也应该给我执行插入操作!也许是某个设置上有问题,但一直没有找到解法[/quote]

为什么没有变化也应该做插入操作呢?能说一下你的理由吗?

你第一次save过后把缓存手动flush并且清空一次再调用一下这个方法试试呢?

应为此时的hibernate状态还是处于持久化状态,你没关闭session,缓存也没刷新,也不算是更新,只是session里面的缓存对象修改了,你在后面加个session.flush()试试,或者session.close()

还有一点 就是你第一次运行完后应该没有存入数据库吧,只是在缓存中存在,当你运行第二次时,其实第一次的就不存在了,第二次是新的开始,所以还是没有存入数据库中。不知道对不对。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问