问题描述
大家看一下这段代码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操作!个人的分析,如有错误,请牛人指出,谢谢!~~~~~~