猜猜看,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又会如何处理呢?
请看后文......
相关文档:
PL/SQL-FOR UPDATE 与 FOR UPDATE OF的区别
url:http://hi.baidu.com/1413/blog/item/a521251f7e5993c4a686696b.html
数据库 oracle for update of 和 for update区别
select * from TTable1 for update 锁定表的所有行,只能读不能写
2 select * from TTable1 wher ......
哎,还是上周的事情了,csdn的博客最近咋老是打不开呢!
基本语句:Alter table 表名 drop Column 字段名
另单单是这样是不行滴,还要删除对应的关系滴。下面就把查找到的那篇文章引用下吧!
原文地址:http://hi.baidu.com/lisky119/blog/item/3c348c082573949c0a7b82d1.html
SET ANSI_NULLS ON
GO
SET QUOTED_IDENT ......
1.使用Management Studio Express,用“Windows身份验证”登录,选中SQL服务器名,右击鼠标选择属性,在服务器属性选项页面,选择“安全性”,将服务器身份验证由“Windows身份验证”改为“SQL Server和Windows身份验证”,单击确定。
2.使用SQL Server 2005外围应用 ......
我们知道用powerdesigner导出的sql文件后缀为'.sql';用phpmyadmin很容易导入MysQL数据库,但是用PHP怎么导入数据库呢?
我用powerdesigner设计一个数据库后导出sql文件(一个投票系统)为'vote.sql';
文件内容为(一些sql语句和注释):
/*======================= ......
SELECT TOP (100) PERCENT
CASE WHEN a.colorder = 1 THEN d .name ELSE '' END AS 表名, CASE WHEN a.colorder = 1 THEN isnull(f.value, '')
ELSE '' END AS 表说明, a.colorder AS 字段序号, a.name AS 字段名, CASE WHEN COLUMNPROPERTY(a.id, a.name, 'IsIdentity')
= 1 THEN '√' ELSE '' END AS 标识, CA ......