易截截图软件、单文件、免安装、纯绿色、仅160KB

猜猜看,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又会如何处理呢?
请看后文......


相关文档:

SQL日志的概念

今天抽出一点时间解释几个关于SQL日志的概念,他们也经常使初学者望而止步,反正计算机的术语都是很抽象的,所以第一感觉就是头疼,然后然后几次后就没感觉了.以下有些是从书上摘抄的,有的是从网上找的算是借花献佛吧!!
  物理日志文件:
    这个比较好理解,实实在在的东西,数据库目录下面的.ldf文件 ......

Truncate Logs for SQL Server 2008

Truncate Logs for SQL Server 2008
I had previously posted how to Truncate Logs for SQL Server 2005. Unfortunately, this method does not work in SQL Server 2008. The reason is because the “WITH TRUNCATE_ONLY” command is no longer in SQL 2008. Assuming you run in full recovery mode, the n ......

SQL server 2005 开始安装后sa无法登录问题

1.使用Management Studio Express,用“Windows身份验证”登录,选中SQL服务器名,右击鼠标选择属性,在服务器属性选项页面,选择“安全性”,将服务器身份验证由“Windows身份验证”改为“SQL Server和Windows身份验证”,单击确定。
 2.使用SQL  Server 2005外围应用 ......

SQL DBA Interview question and answer


<!--
/* Font Definitions */
@font-face
{font-family:SimSun;
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-alt:宋体;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 135135232 16 0 262145 0;}
@font-face
{font-family:"Cambria Mat ......

sql server 2000导出表结构

sql server 2000导出表结构
1.
SELECT   
表名=case when a.colorder=1 then d.name else '' end,   
表说明=case when a.colorder=1 then isnull(f.value,'') else '' end,   
字段序号=a.colorder,   
字段名=a.name,   
标识=case when COLUMNPROPERTY( a.id, ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号