今天在做练习的时候,遇到这样一个问题,update一个persistent状态对象的时候,没有反应......
突然想起来一个小细节.就记下来了-
Hibernate中有这样一种机制:
在更新一个对象数据的时候,会先从一级缓存中把这个对象拿出来,
然后把获得的各项数据和缓存中的各项数据进行对比,如果没有改变,就不会进行update操作,
按照之前自己写DAO的逻辑,会先按id获得这个对象,然后进行字段的修改,但是在Hibernate中,按id取到的对象和缓存中的对象是一样的。所以就不进行修改了:
===================================================================================
//错误代码:
public String update(){
int id=news.getId();
Session ss=HibernateSessionFactory.getSession();
ss.beginTransaction();
ss.update(ss.get(News.class, id));
ss.update(news);
ss.getTransaction().commit();
ss.close();
return "find";
}
===================================================================================
//正确代码:
public String update(){
Session ss=HibernateSessionFactory.getSession();
ss.beginTransaction();
news.setNewsTitle(news.getNewsTitle());
news.setContent(news.getContent());
//ss.update(ss.get(News.class, id));
ss.update(news);
ss.getTransaction().commit();
ss.close();
return "find";
}
===================================================================================
使用update方法还有几个需要注意的地方:
在更新Transient(瞬态)对象的时候会报错.不过在更新指定id并且数据库中有该id的Transient对象时,不会报错。
update()会更新所有的自动,即使你只想更新一个字段!!对于只更新某个字段的话,可以在映射文件中加上dynamic-update属性,取值为true就可以了:<class name="....." table=".." dynamic-update="true">,这样的话,在更新的时候,Hibernate还是会和缓存中的数据进行比较,谁改变了,就只更新谁.Annotation形式现在还不能支持动态更新.不过可以直接用Hql语句.