Hibernate_Notes_4_核心方法(2)

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值