Hibernate持久状态修改错误

 项目中报了identifier of an instance of com.Liuzm was altered from123 to 444搜索的答案都说是java类和Hibernate XML文件参数不一样.然后我检查文件发现是一样的无奈,就查看Hibernate的文档.最后发现和Hibernate状态有关系.因来用了 Hibernate事务大家参考此文章就会明白Hibernate对象的三种状态

 


看下我报错代码

 

CmsContent cc=baseDao.getObject(CmsContent.class,newsid[i]);
cc.setId("444");
baseDao.saveObject(cc);


如果这样就会报
identifier of an instance of com.Liuzm was altered from 123 to 444


换成以下代码:

CmsContent cc=baseDao.getObject(CmsContent.class,newsid[i]);
baseDao.getHibernateTemplate().evict(cc); //清除缓存 持久对象变成脱管对象
cc.setId("444");
baseDao.saveObject(cc);

 

这样就完成了!大家一定会问.为什么?
因为当你获取此CmsContent cc=baseDao.getObject(CmsContent.class,newsid[i]);对象时
Hibernate会把此对象的数放在缓存中,当你没有消除缓存
而对数据进行操作时.Hibernate认为你此时的操作和数据库数据
不一样.所以就会报错. 具体说明.参看下Hibernate对象的三种状态
就知道了

你可能感兴趣的:(xml,Hibernate)