update()方法使一个游离对象转变为持久化对象,并且计划执行一条update语句
1.若更新一个持久化对象,不需要显示的调用update方法,因为在调用transaction
的commit()方法时,会先执行session的flush方法。
2.什么时候用呢?
News news = (News) session.get(News.class,1);//获取对象
</pre><pre name="code" class="java">transaction.commit();//提交事务后,在session缓存里面
session.close();//关闭session对象,news不在缓存对象里面
session = sessionFactory.openSession();//开了一个新的session对象
transaction = session.beginTransaction();//开了新的事务
</pre><pre name="code" class="java">news.setAuthor("SUN");//但是news对象不在这个新的session对象里面,所以不会发update语句,此时news是一个游离的对象 如下
</pre><pre name="code" class="java">session.update(news);//这样news对象又到session缓存里面了
所以更新一个游离对象,需要显式的调用session的update方法,可以把一个游离对象变为持久化对象
3.需要注意的点
1)无论要更新的游离对象和数据表的记录是否一致,都会发送UPDATE语句。(无论有没有news.setAuthor("SUN");)
2)如何能让update方法不在盲目的触发update语句呢?
在.hbm.cml文件的class节点设置一个属性 select-before-update=true(默认为false),但通常不需要设置该属性。
4.若数据表中没有对应的记录,但还调用了update方法,会抛出异常
5.当update方法关联一个游离对象时,如果在session的缓存中已经存在相同的OID的持久化对象时,则会抛出异常,因为在session缓存中不能有两个oid相同的对象
News news = (News) session.get(News.class,1);//获取对象
</pre><pre name="code" class="java">transaction.commit();//提交事务后,在session缓存里面
session.close();//关闭session对象,news不在缓存对象里面
session = sessionFactory.openSession();//开了一个新的session对象
transaction = session.beginTransaction();//开了新的事务
</pre><pre name="code" class="java">
News news2 = (News) session.get(News.class,1)//这个news2就是已经存在的相同OID持久化对象,而news是游离的。
</pre><pre name="code" class="java">session.update(news);
下次更新17,06