posts - 27, comments - 207, trackbacks - 25, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

实体对象的状态设计

Posted on 2006-12-15 17:57 风云 阅读(1817) 评论(17)  编辑 收藏 所属分类: .NETNDO

1实体对象类图:
Entity 状态属性类图.jpg

2: 实体对象状态图:
Entity 对象状态转换图.jpg

3:描述

对于需要持久化的实体对象,在它的生命周期中可处于以下4个状态或混合状态中。

Ø         临时状态(isNew): 刚刚用new 语句创建,还没有被持久化 (isNew = true, isDirty = false, isLoaded = false, isDeleted=false)

Ø         “脏”状态(isDirty:

ü         编辑处于临时状态的实体对象(isNew = true, isDirty = true, isLoaded = false, isDeleted=false)

ü         编辑处于持久化状态的实体对象(isNew = false, isDirty = true, isLoaded = false, isDeleted=false

Ø         持久化状态(isNew=false,isDeleted=false:

ü         Load方法加载的对象(isNew = false, isDirty = true, isLoaded = true, isDeleted=false)

ü         把临时状态的对象通过Insert/Save/Update方法进行保存(isNew = false, isDirty = false, isLoaded = false, isDeleted=false)

ü         把持久化状态的对象通过Save/Update方法进行保存(isNew = false, isDirty = false, isLoaded = false, isDeleted=false)

Ø         游离状态(isDeleted:调用对象的Delete方法已经从数据库中把对应的记录移除(isDeleted=true,处于游历状态的对象是不能够再进行CRUD操作了,否则系统会抛出一个不能对游历态对象操作的异常

 

4:  问题描述

      以上是NDO Framwork 中关于实体对象的状态设计图,希望大家帮我看看指出其中的不足。另外有一个困惑我了一下午的问题: 把一个实体对象对应的数据库记录删除后则该对象处于游离态还是出于临时状态,如果是出于临时状态的话那么游离态就没有存在的必要性,希望就这个问题听听大家的看法。

Feedback

#1楼    回复  引用  查看    

2006-12-15 18:55 by Anders Cui      
我的理解:
临时状态(持久化以前)
持久化状态
脏状态(编辑持久化的对象)
删除状态(删除持久化的对象)
这样会比较清晰点吧

像你说的:持久化状态也包含临时状态的对象,合适吗?

#2楼    回复  引用  查看    

2006-12-17 10:11 by ayuan[匿名]      
感觉实体本身的设计并没有你描述的这么复杂。
个人感觉,
尽量减小实体的作用域,
isDirty 的情况是可以避免的, isLoaded 的状态是可以被忽略的。
只有初始状态和析构状态就已经足够了,出现isDirty 和isLoaded 是不合理的程序设计导致的。

个人拙见 :)

#3楼 [楼主]   回复  引用  查看    

2006-12-18 09:09 by 风云      
@Anders Cui
谢谢你的点评,你的观点基本上和我的观点一样,不过对于脏状态是由区别的。可能我文中没有说清楚,让你造成误会了,:)。

本文的“脏”指的是只要字段属性发生了改变都称为是“脏”的,不管是临时对象还是持久对象,否则是“干净”对象(新创建和新加载的对象都是"干净"对象)

“持久化状态也包含临时状态的对象”持久化状态是不包括临时状态的对象,我文中写的是“ 把临时状态的对象通过Insert/Save/Update方法进行保存"后的对象就变成了持久化对象了,这句话我没有写清楚,让你误会了,不好意思,哈哈!

#4楼 [楼主]   回复  引用  查看    

2006-12-18 09:37 by 风云      
@ayuan[匿名]
你说的有一定道理,在一般情况下是正确的,但是在一个持久化框架中不得不认真考虑其它的状态了,比如HIBERNATE,HIBERNATE就是根据实体对象的状态自动完成实体的插入,更新等操作了!

#5楼 [楼主]   回复  引用  查看    

2006-12-18 13:17 by 风云      
怎么这么多垃圾广告呢????????????

#6楼    回复  引用  查看    

2007-02-28 08:35 by craboYang      
目前这么多DAL, 我觉得你这套最喜欢. 是否会发布源码呢? 这样我可以放心使用了.

其实即使开放了也不见得有多少人就用到商业项目中,大可不必怕人抢饭碗啊:)

#7楼    回复  引用  查看    

2007-03-02 10:34 by 东风31      
@风云
我们把脏特别提取出来作为一种状态标记,目的应该是为了处理某一些情况吧~
而没有持久化之前的实体是否为脏有什么意义呢?

#8楼    回复  引用  查看    

2007-03-02 10:49 by 东风31      
我觉得游离状态定义为逻辑删除是不是更好一点?物理上已经删除了,还需要保留这个实体实例吗?

#9楼 [楼主]   回复  引用  查看    

2007-03-02 18:48 by 风云      
@东风31
problem: 没有持久化之前的实体是否为脏有什么意义呢?
answer: 持久化之前的实体是脏状态那么可以根据该状态进行插入操作!

#10楼    回复  引用  查看    

2007-03-06 14:16 by 东风31      
@风云
在你的状态定义里,只要是状态为IsNew的,那么实体提交到Dal的时候就应该进行插入操作了。至于它是否为“脏”,应该是没有意义了

#11楼 [楼主]   回复  引用  查看    

2007-03-06 14:19 by 风云      
只要是状态为IsNew的,并且isDirty = true 的,那么实体提交到Dal的时候就应该进行插入操作了。

#12楼    回复  引用  查看    

2007-03-06 17:20 by 东风31      
哦,我有点明白你的设计意图了。
但是,这样做的话,Dal是否就隐含了一条业务规则:
记录的字段值不能全为Null?
这是否合适呢?

#13楼    回复  引用  查看    

2007-03-06 17:32 by 东风31      
@风云

临时状态:实体在没有持久化之前的状态。
“脏”状态:实体已经被持久化,并在应用程序中被修改。
持久化状态:实体已经被持久化,并在应用程序中未被修改。
游离状态:逻辑上删除实体(数据库中的条目未被删除)

例如:
当在应用程序中直接new一个实体时,该实体的状态为 临时状态。而如果通过Dal读取时,实体的状态为 持久化状态。如果应用程序修改了此实体的属性值时,实体的状态改为 脏状态。如果应用程序试图删除实体对应的数据库记录时,实体的状态改为 游离状态。状态为游离状态的实体提交到DAL执行完毕后,实体直接销毁,因此不需要定义此种状态。

#14楼 [楼主]   回复  引用  查看    

2007-03-06 17:36 by 风云      
@东风31
多谢你的建议! 你回答的非常好,你说的实体状态和HIBERNATE差不多,对于游离状态的建议非常好,我在NDO的设计中最后也没有定义游离状态.

#15楼    回复  引用  查看    

2007-03-08 15:37 by 东风31      
@风云
我到觉得可以保留游离状态,只是需要改变一下它的定义。
想象一下,如果我们需要对一个数据集中的元素执行CRUD动作,这样,保留游离状态可以很方便的把CRUD动作反映到数据库中。
不过,这几天尝试了一下利用实体状态来执行CRUD操作,确实简化了DAL,但却使得Entity变的复杂了。似乎各有利弊。

#16楼 [楼主]   回复  引用  查看    

2007-03-08 15:43 by 风云      
@东风31
你说的非常好,你的建议我先前和几个同事讨论了很多次,最终大家的观点达成了一致-不需要游离状态,降低复杂度.

用实体状态来执行CRUD操作(活动记录),确实简化了DAL,但却使得Entity变的复杂了. 非常正确!

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-12-15 18:05 编辑过


相关链接: