save update saveOrUpdate

save(),update(),saveOrUpdate()
1.save()导致的最终结果是执行insert语句,先看下面的代码:

1. Session session2=HibernateUtil.getSession(); Customer c2=(Customer)session2.load(Customer.class, new Long(5));
2. HibernateUtil.closeSession(session2);
3. c2.setName("ghsea5");
4. session.save(c2);
5. tx.commit();

这里查询出的是ID为5的一个对象,执行session.save(c2)后数据库里会插入一条ID为6的数据,如果只是想修改这个ID为5的对象的name属性,而不是新插入一条数据,可以执行session.flush(),使session与数据库同步。不要错误地用save()去同步session缓存和数据库。它只是用来保存一个记录的,是用来“Persist the given transient instance, first assigning a generated identifier”。

update和saveOrUpdate是用来对跨Session(即脱 管的)的PO进行状态管理的。
2.“update的作用就在于此,它只会被用于当一个PO对象跨Session进行状态同步的时候才需要写。而一个PO对象当它不需要跨Session进行状态管理的时候,是不需要写update的。”

1. tx=session.beginTransaction();
2. Session session2=HibernateUtil.getSession();
3. Customer c2=(Customer)session2.load(Customer.class, new Long(5));
4. HibernateUtil.closeSession(session2);
5. c2.setName("ghsea5");
6. session.update(c2);
7. tx.commit();

执行第4行后,c2变成脱管对象,第6行,用session对以c2进行更新,这里c2是跨Session的。

3.saveOrUpdate和update的区别就在于在跨Session的PO状态管理中,Hibernate对PO采取何种策略。


1. public void addMate(Grade cat, Student mate) {
2. Session session = ...;
3. Transacton tx = ...;
4. session.saveOrUpdate(cat);
5. cat.addMate(mate);
6. tx.commit();
7. session.close();
8. };

上面这些代码用到saveOrUpdate是合理的,如果用save()不一定合适,试想一下,如果只是想给一个存在的Grade(班级)添加一个Srudent,用save()导致的结果将是向数据库中插入一条新的记录,即一个新的班级,而saveOrUpdate的策略是,如果该对象的ID已经存在,则执行update(),如果该对象的ID不存在,则用save()策略。
Hibernate此时究竟采取更新cat对象,还是save cat对象,取决于unsave-value的设定。如下面这样设定unsave-value:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值