xiexifeng110 2011-04-06 18:08
浏览 196
已采纳

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条回答

  • yj1006 2011-04-06 18:08
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

悬赏问题

  • ¥15 高德地图点聚合中Marker的位置无法实时更新
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办