猜猜看,Hibernate会执行几句SQL(一)

 

POEAA中介绍了ORM中最重要的模式之一:Unit Of Work。看似简单,实现起来却非常复杂。

Hibernate完美的实现了这个模式。以下我用一系列的例子来分析Hibernate的处理机制

 

下面有三个例子,猜猜看Hibernate会执行几句SQL(省略事务处理代码,实体对象叫User,假设主键是自增型的)

 

例1:

User user = new User();

user.setName("KENT");

session.save(user);

session.save(user);

 

例2:

User user = new User();

user.setName("KENT");

session.save(user);

user.setName("JACK");

session.save(user);

 

例3:

User user = new User();

user.setName("KENT");

session.save(user);

user.setName("JACK");

session.save(user);

user.setName("TOM");

session.save(user);

 

让我们看看答案

例1:两次save,仅仅执行insert语句一次,没有执行update

例2:执行insert语句一次,先insert成KENT,然后执行update,然后update成JACK

例3:执行insert语句一次,先insert成KENT,然后执行update,然后update成TOM,没有update成JACK的过程

 

你猜对了吗?

 

我们看Hibernate源码,看到UnitOfWork大致原理是这样的:

  • Hibernate并不是save()了就直接执行sql,而是使用延时执行的方式。直到flush时才会一次性执行多句sql
  • Hibernate使用Action接口表示每次增删改的行为,所有的行为都使用ActionQueue排序
  • 当执行一次save()方法,Hibernate会判断此对象的状态。如果是Transient就在ActionQueue中增加一个InsertAction,并生成此对象的主键,把此对象标记为Persistent。同时,会把所有属性的状态保存到一个数组中。
  • 再次执行save()方法时,如果是Persistent,并不会直接产生updateAction
  • 当数据commit之前,一定会执行flush(),根据保存的所有属性的状态,判断当前对象的字段是否被更新过,如果被更新过,则会在ActionQueue中增加一个UpdateAction

所以

例1会产生InsertAction

例2会产生InsertAction、UpdateAction

例3会产生InsertAction、UpdateAction

 

此例中只是新增或修改,如果有删除和查询,Hibernate又会如何处理呢?

请看后文......

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值