今天在做练习的时候,遇到这样一个问题,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语句.