日期:2008-06-03 浏览次数:20430 次
[NonSerialized] private ArrayList updates;
记录所有的ScheduledUpdate对象,ScheduledUpdate对象是通过要Update的持久对象创建的;
[NonSerialized] private ArrayList deletions;
记录所有的ScheduledDeletion对象,ScheduledDeletion对象是通过要Delete的持久对象创建的;
以上三个计划对象都从ScheduledEntityAction对象继承,而此对象实现了IExecutable接口,IExecutable接口的Execute方法用于执行执久化操作,此操作由Flush间接调用。
下面来看看Flush的代码:
public void Flush() {
if (cascading>0) throw new HibernateException( "..." );
FlushEverything();
Execute();
PostFlush();
}Execute执行所有的计划对象。
private void Execute() {
log.Debug("executing flush");
try {
ExecuteAll( insertions );
insertions.Clear();
ExecuteAll( updates );
updates.Clear();
//...
ExecuteAll( deletions );
deletions.Clear();
}
catch (Exception e) {
throw new ADOException("...", e);
}
}分别执行insert/update/delete计划。
private void ExecuteAll(ICollection coll) {
foreach(IExecutable e in coll) {
executions.Add(e);
e.Execute();
}
if ( batcher!=null ) batcher.ExecuteBatch();
}
3. Save
ISession有两种保存持久对象的方法,区别在于有没有指定对象Id(标识符)。
public object Save(object obj) {
if (obj==null) throw new NullReferenceException("attempted to save null");
if ( !NHibernate.IsInitialized(obj) )
throw new PersistentObjectException("uninitialized proxy passed to save()");
object theObj = UnproxyAndReassociate(obj);
EntityEntry e = GetEntry(theObj);
if ( e!=null ) {
if ( e.Status==Status.Deleted) {
Flush();
}
else {
log.Debug( "ob