今天你持久化了吗?

     当持久化兴起的时候,逐渐形成了实体层这个概念了。hibernate,jdo,以及博客园的nbear都可谓是大名鼎鼎!有的公司不使用这种ORM框架,他们使用一些自动生成工具生成实体(例如用Codesmith生成),并生成和该表对应的业务逻辑,于是乎感觉我们的程序好像一下子全都写好了,下一步就轻松了,我们只要扩展业务即可了!莫非这样真是那么方便了?在维护上真的是最便捷吗?
     其它的持久层解决方案不敢说,但至少我觉得像orm的鼻祖hibernate那种开发机制,在维护还是相当之麻烦呀!一个实体还得对应一个xml文件(虽说这些都可以自动生成),但是你深入项目的时候去想想,我们的业务真能一切都可以定下来吗?人的思想总是在变的,客户的需求就更难以着磨了!哪天我们要给程序加个字段,你想想你必须要走几步改动?首先我们必须重新生成xml和实体,然后我们必须还得在业务逻辑中增加代码,还得在视图层加一个界面(如加一个input输入框等)!讲实话,加一个字段对这种orm框架的改动还是最少的,哪天假如说我们修改了哪个字段的名称、修改了字段类型,你想想,天呐!很难想像,和这个字段关联的程序都得改动!如果名称改了,ok,你可以全部替换它的原先名称,改成你新的名称。那类型改了呢?没办法只能手工一个个改掉所有的赋值的类型吧?视图层、控制层中的验证(js验证,业务验证)、逻辑层、实体层,xml配置等等都必须动。搞啥个hsq,这和sql不差不多了吗(虽然说hsq,抽象了数据库模型)?不过我想没有程序员不懂sql的吧?况且hsq对复杂的语句还是会力不从心的吧!
     运用ORM框架势必会运用大量的反射,代价是牺牲性能。当然现在的各种ORM框架都在尝试使用各种方法来减轻这块(LazyLoad,Cache),效果还是很显著的。可是我们牺牲了这么大的性能,而且我是觉得在维护上ORM还是最便捷。
      真不知道为啥像hibernate这样的框架还有一个xml配置文件?如果我真ORM的话,我不能把这些数据关系缓存起来,动态取关系不就行了吗?这样我不更灵活了吗?
     当然使用ORM也有它的活的活之处,在维护上那种自动生成的方式(petshop模式)比使用ORM框架维护量上更大一些,那种构架如果是每个数据操作对应一个存储过程的改动会更会让人晕头转向的。其构架大致如以下描述:
     主要由BLL,MODEL,DAL三层构架方式实现,BLL存放的是相关业务,MODEL是相关的数据库表格实体,DAL业务的SQL语句(或存储过程参数).为了松散耦合,在BLL层和DAL层中间加入了工厂层(Factory),其作用是方便DAL层的载体变动(如把Sqlserver改成Mysql),在DAL层有一个setObject数据库字段到实体属性设置,便于数据库表格映射成实体。
     程序编写的最大问题就是耦合高,怎么降耦也是开发的一个重中之重。以上述的程序构架来看,如果我改动了数据库中的其中一个表格的某个字段,程序改动的至少就有三层。如果再按照自动生成方式那种看,DAL中的update,insert,select, setObject都需要改动,如果存在存储过程的话,像get,getAll,update,insert都必须改动,想象一下这里改动地方有几处了?而且还需改动Model层,修改量之大可见一斑。当然我们这里可以用自动生成工具生成并替换,可又有谁知道这里面的替换工作量多少?
     总之,提倡"高内聚,低耦合"是构架永恒的话题,寻找便捷亦是构架的终级目标。
 待续(下步讲讲我的开发框架)
Tag标签: 持久化,ORM,构架
posted @ 2008-07-21 10:50 netcorner 阅读(2183) 评论(71)  编辑 收藏 网摘 所属分类: 框架设计篇

  回复  引用  查看    
#1楼2008-07-21 10:58 | Allie      
-,,- 框架~博主看来有一定水平了 关注!
  回复  引用    
#2楼2008-07-21 11:00 | xm[未注册用户]
期待下文的介绍
  回复  引用  查看    
#3楼2008-07-21 11:01 | 鹿亮      
很有同感 ,我用的是自动生成工具,自动生成业务层不能满足我的要求,我要添加代码,但是后面可能还要添加自段,那是的修改量可见一般,你是再生成也不是,这样的话自己加的代码要一点一点的拷过来,还怕漏掉什么东西,一点点改吧,量也不小,真不知道还有什么更好的框架没
  回复  引用  查看    
#4楼[楼主]2008-07-21 11:08 | netcorner      
我的目标是实现:一种可配置型的程序框架!
  回复  引用  查看    
#5楼2008-07-21 11:19 | 姜敏      
LZ能否说明一下为什么要应用框架呢?它的好处在哪?不用会有什么样的缺陷?
  回复  引用  查看    
#6楼2008-07-21 11:21 | henry      
组件和代码生成的东西其目的都是一样.尽可能让用户更透明.
代码生成工具如果能达到和组件的一样的透明性那么和组件所发挥的作用没有本质上的区别.

  回复  引用    
#7楼2008-07-21 11:36 | 路过的[未注册用户]
你用数据模型去考虑必然得到这样的结果,换换思考的方式吧
  回复  引用  查看    
#8楼[楼主]2008-07-21 11:41 | netcorner      
--引用--------------------------------------------------
路过的: 你用数据模型去考虑必然得到这样的结果,换换思考的方式吧
--------------------------------------------------------
数据模型?请问用啥方式去思考?

  回复  引用  查看    
#9楼2008-07-21 11:43 | jadesun      
哪天假如说我们修改了哪个字段的名称、修改了字段类型,你想想,天呐!很难想像,和这个字段关联的程序都得改动!如果名称改了,ok,你可以全部替换它的原先名称,改成你新的名称。

如果我改动了数据库中的其中一个表格的某个字段,程序改动的至少就有三层。

------------------------------

针对楼主的这种看法,感觉上楼主对ORM映射还不是很了解。

ORM是这样的映射写法
<property name="approval" type="string" column="DB_APPROVAL" />

type为类型,column对应的是数据表的字段。

程序中应用的是name。OK,根据楼主的描述,改类型和名字,只是修改type和column而已。程序中应用的是name,一切都没有变化。

  回复  引用  查看    
#10楼[楼主]2008-07-21 11:51 | netcorner      
@jadesun
那起码你还得改xml和程序是吧?我想表达的意思是为什么不过这个数据库关系缓存呢?

  回复  引用  查看    
#11楼2008-07-21 11:59 | jadesun      
@楼主
XML配置是肯定需要修改的,但程序不需要。当然字段的类型从String改成了Integer,那么程序中也肯定相应的修改get的类型。反过来说,难道不用ORM就不需要修改了吗?用了ORM至少会比传统形式的代码量修改要少。

楼主的想法,或许要在对象型数据库中才能实现,在关系型数据库中还没有这样的思想吧。看看db4o

  回复  引用  查看    
#12楼[楼主]2008-07-21 12:26 | netcorner      
@jadesun
以我现在设计的框架来说,改类型是不需要修改程序的的,如果要改也就是在xml中配置验证规则。

  回复  引用  查看    
#13楼2008-07-21 12:39 | 横刀天笑      
很是期待的,呵呵
  回复  引用  查看    
#14楼2008-07-21 12:44 | 金色海洋(jyk)      
确实存在改字段名、字段类型不需要该程序的方法。

只是大家都被三层、OO的思想束缚了,所以才没有想另一个方向去想。

可能我的想法和lz的会有相似之处,但是好像实现细节会不太一样。

有空我也会说我的想法的。

不知道lz看过我的分页控件没?

http://www.cnblogs.com/jyk/category/135294.html" target="_new">http://www.cnblogs.com/jyk/category/135294.html

  回复  引用  查看    
#15楼[楼主]2008-07-21 12:50 | netcorner      
@金色海洋(jyk)
在我的框架里面,这些分页也全都集成进去了!而且已目前在我的框架,已经没有采用asp.net的那种机制,视图方面主要是用nvelocity做模板。

  回复  引用  查看    
#16楼2008-07-21 12:53 | jadesun      
@楼主

比如:原先的程序中
phone.setNo("010-8888888"); <-- 为了某种方便,硬性编码。

现在No强制改为了数字。String-->Integer。那么类似这样的程序,你能通过XML的配置修改吗?估计最多只能验证不允许输入String类型数据为止。

  回复  引用  查看    
#17楼[楼主]2008-07-21 12:57 | netcorner      
@jadesun
嗯!只需要配置载体修改即可!

  回复  引用  查看    
#18楼2008-07-21 13:01 | Gray Zhang      
HQL的作用是隐藏不同数据库产品间的差异,而不是什么抽象数据库模型,真正抽象数据库好歹也要LINQ这种语法上的支持吧
  回复  引用  查看    
#19楼[楼主]2008-07-21 13:05 | netcorner      
@Gray Zhang
那有可能用词不够好吧!我想表达的意思是hql是一种对sql封装的隐藏的语法。

  回复  引用  查看    
#20楼2008-07-21 13:09 | 金色海洋(jyk)      
nvelocity做模板 是什么?
  回复  引用  查看    
#21楼[楼主]2008-07-21 13:12 | netcorner      
@金色海洋(jyk)
一种视图表现的模板引挚,和stringtemplate类似。

  回复  引用  查看    
#22楼2008-07-21 13:23 | T2噬菌体      
期待下文……
  回复  引用  查看    
#23楼2008-07-21 13:52 | 2008年的梦想      
高人,我还没有用过,连分层都不会。
  回复  引用  查看    
#24楼2008-07-21 14:08 | 狼Robot      
改动,觉得这是不可避免的东西,重要的是如何以最小的改动来实现新的需求.我现在的做法是把数据库的信息记录在实体上,在首次用到这些信息的时候就把数据读出来并缓存起来.DAL层,一些常用的操作是自动生成SQL,满足一般的需求(增,删,改,查询,分页查询等),但是多表组合查询就要自己实现了.实体数据的赋值统一一个入口来处理(也可以自己实现),根据实体的信息自动赋值.所以在改动比较小的情况下,只要生成一次实体就OK了.

现有的ORM框架我一个都没看过,都是自己怎么方便怎么写.

  回复  引用  查看    
#25楼2008-07-21 14:17 | kiler      
--引用--------------------------------------------------

但是你深入项目的时候去想想,我们的业务真能一切都可以定下来吗?人的思想总是在变的,客户的需求就更难以着磨了!哪天我们要给程序加个字段,你想想你必须要走几步改动?首先我们必须重新生成xml和实体,然后我们必须还得在业务逻辑中增加代码,还得在视图层加一个界面(如加一个input输入框等)!讲实话,加一个字段对这种orm框架的改动还是最少的,哪天假如说我们修改了哪个字段的名称、修改了字段类型,你想想,天呐!很难想像,和这个字段关联的程序都得改动!如果名称改了,ok,你可以全部替换它的原先名称,改成你新的名称。那类型改了呢?没办法只能手工一个个改掉所有的赋值的类型吧?视图层、控制层中的验证(js验证,业务验证)、逻辑层、实体层,xml配置等等都必须动。

--------------------------------------------------------



这和orm有关系吗,你不用orm这个问题就解决了吗?
顺便说一下是hql,不是hsq,个人觉得这个东西是Nhibernate里面一个比较失败的设定,事实上用Nhibernate开发要体现Nhibernate的效率的话,应该是要推荐使用Criteria查询的,hql的存在使得大量熟悉sql的开发人员去别扭的使用Nhibernate开发,反倒使开发更麻烦了。


--引用--------------------------------------------------
真不知道为啥像hibernate这样的框架还有一个xml配置文件?如果我真ORM的话,我不能把这些数据关系缓存起来,动态取关系不就行了吗?这样我不更灵活了吗?

--------------------------------------------------------
总得有个东西保存数据库的中表和程序中的业务类的对应关系,就象你说的缓存起来,那不也要存一个地方吗?没有这样的东西程序怎么分析啊。

  回复  引用  查看    
#26楼[楼主]2008-07-21 14:24 | netcorner      
@kiler
ORM最麻烦的是每个表格对应一个实体,所以一般来说带来的维护会更多一些!如果你这个程序已经写在业务逻辑时带来的联动就会更大!假如我在DAL层中构建一种可配置化的业务逻辑,再加上可配置化的UI层,那就带来的维护就会更少!

  回复  引用  查看    
#27楼[楼主]2008-07-21 14:26 | netcorner      
@狼Robot
那么你还是存在一种实体层是吗?实体层还得生成和表格对应的属性吗?

  回复  引用  查看    
#28楼2008-07-21 14:28 | kiler      
@狼Robot

你这个做法和orm去实现的东西是一样,没啥区别。

  回复  引用  查看    
#29楼2008-07-21 14:33 | 鬼不灵      
我也在用codesmith但是,生成的能用的很少,大部分还是要自己一层层的编写方法。
  回复  引用  查看    
#30楼[楼主]2008-07-21 14:42 | netcorner      
@kiler
对,ORM是只管数据访问,是可以用代码生成器生成代码,不过不觉得代码生成是一个多余的步骤吗?不觉得繁琐和多余吗?而且布署一个小小的字段改动(假如说不没写在bll中),你就得重新生成实体层吧?而且个人认为用实体进行的直接反射操作在性能上值得商榷吧?

  回复  引用  查看    
#31楼2008-07-21 14:42 | 阿一      
期待下文。
金色海洋说的好,不要被三层、OO的思想束缚。
所以也不要为了ORM而ORM。

  回复  引用  查看    
#32楼2008-07-21 14:48 | kiler      
@netcorner
一点也不繁琐,生成的代码远比反射来的效率高,不知道你为什么对生成的代码的有意见,我们写得aspx页面不也会生成大量后置design.cs代码吗,但是这个也没影响我们使用啊,代码结构合理的话,这个不是问题,其实做到一点就好了,把生成的代码和自己实际使用的代码用继承方式或者是局部类的方式分开。这样重新生成代码对我们来说就没有什么影响了。

  回复  引用  查看    
#33楼[楼主]2008-07-21 14:55 | netcorner      
个人觉得,直接使用如Hashtable或IDictionary的字典容器即可,不需要实体,减少因为实体带来较大的反射性能损失(虽说有廷迟加载).当然若用Hashtable可能还存在类型转换过程(装箱转换过程),也是一大麻烦!不知各位园友有何其它的高见?
注:我这里用到像Hashtable或IDictionary的字典容器是因为在dal层上面还有一个可配置化(xml配置)的逻辑层和相关的控制,用实体的话性能和维护上远远没有Hashtable或IDictionary的字典容器

  回复  引用  查看    
#34楼[楼主]2008-07-21 15:02 | netcorner      
@kiler
你是用代码生器生成每张表格的数据操作还是用ORM框架的?

  回复  引用  查看    
#35楼2008-07-21 15:12 | kiler      
@netcorner

我有两个框架一个是基于ado.net的一个基于orm的,即使是使用orm的话一样要也写一个数据层访问类来访问数据,和直接生成增删改查sql构建一个数据层访问类来访问数据库是差不多了,用orm并不代表除了实体类和配置以外数据访问类这块就不要生成代码了,唯一的不同就是使用了orm以后,生成的代码简洁点。



你提到Hashtable或IDictionary的字典容器其实Nhibernate内部也是有的,Nhibernate第一次运行时,会解析xml文件,在内存中生成这些东西缓存起来,供数据持久化使用,Nhibernate不会去时时解析xml文件的。

  回复  引用  查看    
#36楼2008-07-21 15:18 | 笑疯^_^      
期待楼主下文!~~~~~~~~~~~~
  回复  引用  查看    
#37楼[楼主]2008-07-21 15:24 | netcorner      
@kiler
如果你用代码自动生成机制不用ORM的话,你不用把生成的dal层重新覆盖?相反使用orm框架改动比你的还少点呢!(不求效率的话)
你重新生成的不用覆盖旧版本的吗?我想还是要的吧?
重新生成真的不觉得麻烦?
想想,如果我只要在业务配置文件中,改一下和你重新,哪个会更方便些?而且我这个配置甚重不需要重新布署生成

  回复  引用  查看    
#38楼[楼主]2008-07-21 15:26 | netcorner      
@kiler
hibernate里可以存在不需要实体的是吧?然后在内存缓存是吗?那为啥不把关系数据全都缓存起来呢?xml不是多余的?而且个人认为,一个不存在实体层的数据访问应该已经不过持久化了吧?hibernate不就是被冬眠了吗?

  回复  引用  查看    
#39楼2008-07-21 15:51 | kiler      
@netcorner
我不是说了吗,用继承或者局部类来解决代码覆盖的问题。
对于我的框架例来说实体有两个:
一个BaseEntity抽象类,一个具体Entity类。
BaseEntity里面存放的就是所有的生成的代码。
Entity类的里面什么代码都没有直接继承BaseEntity。orm直接映射到Entity类。所有我们自己要实现的东西都写在Entity类里,BaseEntity里面什么也不用写,到时候数据结构改了,重新生成代码覆盖BaseEntity类即可,不会覆盖我们自己写得代码。
数据访问层和业务层同上。
重新布署生成也不是什么麻烦事啊,就是拷一个dll到服务器上,不比你在服务上改改配置工作量多多少。

Nhibernate不能脱离实体类,Nhibernate只是说内部实现用Hashtable或IDictionary的字典容器缓存了xml文件里面的内容而已。

  回复  引用    
#40楼2008-07-21 16:06 | mclkyo[未注册用户]
kiler能不能详细点讲一下你那种BaseEntity的做法
是一个实体一个BaseEntity,还是怎么做呢?

  回复  引用  查看    
#41楼[楼主]2008-07-21 16:12 | netcorner      
@kiler

生成代码是一个步骤并再去覆盖,然后再重新重成,然后再传到服务器?(假如你这个改动不涉及你的被继承类的话),对我来说,这些步骤仍然是多余的!貌似是一个简单的步骤,真有想象中那么快捷方便?会比只需要改变多数人看得懂的配置文件简单快捷?我相信即使是做去一个小小的覆盖,我估计,去做这个行为的人还得相当熟这套框架!程序的宗旨难道不是提供我们更便捷吗?

  回复  引用  查看    
#42楼2008-07-21 16:22 | Eeyore      
个人感觉像在讨论ibatis.net和nhibernate之类的实现方式~
  回复  引用    
#43楼2008-07-21 16:25 | tornado123[未注册用户]
生成方式固然在执行效率上效高的优点,但是从程序开始的构建,还得一个个去写项目什么的,再到改动时的覆盖!还没ORM的便捷呢!
  回复  引用  查看    
#44楼[楼主]2008-07-21 16:27 | netcorner      
@Eeyore

ibatis.net不是机制不是很了解!它不需要实体层的吗?

  回复  引用  查看    
#45楼2008-07-21 16:27 | kiler      
@netcorner

你要做的东西是一个很理想的框架,能做出来确实好,那是真的能做的那么理想化吗,不用写code就可以出系统,想起来确实很完美,我不知道你做的这套东西有多完美,比sharepoint强吗?即使是用sharepoint实施也是问题多多的,真的做到了能解决所有的业务问题吗,我觉得与其去研究这些东西,倒不如老老实实写代码。

@mclkyo
就是是一个实体一个BaseEntity
实体里面写自己实现的代码,BaseEntity放置生成的代码,实体类继承BaseEntity,(我说的BaseEntity是有多个的,一个表就会对应一个BaseEntity如:BaseNewsEntity,BaseUserEntity)。这样设计好处的就是数据库字段改了,重新生成代码覆盖一下就好了,不会冲掉你现在写的代码的。

@tornado123
代码生成和orm没有什么冲突的,orm一样的也是需要代码生成的。

  回复  引用  查看    
#46楼[楼主]2008-07-21 16:41 | netcorner      
@kiler
不是说代码不用写了,对于简单的关系的,如一张表的或者存在二三张表格关联的,这些我觉得是不用写一行代码的!如果遇到业务复杂的,会有另一层个服务层,里面还得写程序,只不过我是没采用的是实体去构建摆了!当然框架还在设计中,有很多不足的地方,我只是想让自己和程序员们写起来更方便,更易维护摆了!至于你说sharepoint,我没详细用过,它是不是还可以扩展写代码的呢?现在,我这种方式正应用于项目中,出来的问题是挺多的,但是这些都是可以解决的。而且每次bug或功能需求改动会带来积累过程!老老实实的去写代码是按常规的去写是没问题,但是人总是需要创新的吧?没试过怎么知道不行?即使这方式不能实际运用或者失败,也会有一些收获吧?

  回复  引用  查看    
#47楼2008-07-21 16:43 | Eeyore      
--引用--------------------------------------------------
netcorner: @Eeyore
<br>
ibatis.net不是机制不是很了解!它不需要实体层的吗?
--------------------------------------------------------
要,但比较灵活,基于配置文件,可控性强~园子里有好多文章,可以去查查~

  回复  引用    
#48楼2008-07-21 16:45 | sharper[未注册用户]
ibatis.net 返回dataTable 将会方便不少

ibatis.net 的一个分支代码中有 DataTable ResultClass 的实现

  回复  引用  查看    
#49楼2008-07-21 17:03 | 胡国宏      
与楼主深有同感!

ORM不是万能的,除了提高开发效率(需求剧烈变动,根本就不会提高开发效率、可维护性)外,最主要的是规范了项目组内各程序员的代码,如果没有一个
ORM层,各程序员写直接的connection command reader 等等,项目规模大的情况下,你没有底气确定这些connection command reader是否都正常关闭了,而未正确关闭这些对象对于稳定性要求高的系统是相当致命。

另外,我很不认可hsql这种意图替代sql的东西,hsql最大的好处是异构数据库的可移植性。
大部分程序员是做项目,而非产品,做项目其实采用什么数据库需求设计阶段就已经明确了,不可能再变化。
企图发明另外一种sql替代现在的sql的想法一开始就是错的,哪个搞企业开发的不会SQL,就是运维人员这也是基本技能。
说到这,不得不提下.net 3.5中推出的linq to sql这种东东,linq to object我认为不错,但linq to sql就是多此一举了,增加开发人员的学习量而已!

再者,需求的变动引起数据库结构变动、程序变动本身就不是ORM能解决得了,
处理这些变动而减少代码的更改,应该是一个更强大的类似于BOS(商业操作系统)的东西解决,非单人所能完成。比方说用友NC和金蝶EAS中的业务定义、业务内部流程定义、业务流程定义(多业务之间的业务传递)、界面显示定义、打印定义、自定义项管理等等,这些功能都是很大提高我们的开发效率,应对需求变动的措施。

但即使有BOS这种东西,就不用该任何代码了吗,至少现在是不可能的,大家看看用友、金蝶都设有二次开发部,就想明白了。

  回复  引用  查看    
#50楼2008-07-21 17:05 | 笨小苏      
我的经验是,没事别随便制造框架
  回复  引用  查看    
#51楼2008-07-21 17:52 | 金色海洋(jyk)      
好像确实和lz的思路确实比较像。

建议lz不用在这里讨论了,拿出来个实例来就可以了。

  回复  引用  查看    
#52楼2008-07-21 21:25 | 狼Robot      
--引用--------------------------------------------------
netcorner: @狼Robot
那么你还是存在一种实体层是吗?实体层还得生成和表格对应的属性吗?
--------------------------------------------------------
楼主的意思是连实体都不要么?
如果嫌实体麻烦可以把实体去掉,需要数据库表信息的时候直接去数据库里取.当然,这样做不知道对性能什么的有没有影响,我没试过,但我见到有人这样做过.

我的目标还没有达到楼主那么强大,我只是想以尽可能少的修改来适应新的需求(我不求程序做出来了就不用改了),所以目前只能达到改了数据表要改对应的实体(BLL/DAL基本不用改).其实这个实体的存在也只是为了在.的时候后面能够跟着出来东西,写的时候不要写错了而已,其它的也没啥太大的意义.

  回复  引用  查看    
#53楼[楼主]2008-07-21 21:32 | netcorner      
@狼Robot
像sqlserver里面不是有表格关系和表格的相关系信息吗?把这些缓存起来不就好了!还不确定其它数据库是否也具有表格关系和表格信息的

  回复  引用  查看    
#54楼[楼主]2008-07-21 21:33 | netcorner      
@金色海洋(jyk)
下篇几篇文章会介绍

  回复  引用  查看    
#55楼2008-07-21 21:47 | 阿牛      
需要是一定有变化的,那么我们要做的,是在变化时,可以用强类型或者编译器,来找出所以应该修正的地方。

如果是用Sql,楼主有把握编译器提醒你要改哪里吗?


  回复  引用  查看    
#56楼2008-07-21 22:01 | xiaof2000      
真对不同的系统,解决方案是不一样的。
期待下文!

  回复  引用  查看    
#57楼[楼主]2008-07-21 22:04 | netcorner      
@阿牛
对,有实体确实可以让编译器编译时知道哪个地方需要改的,有时候是很矛盾,但是对于我的程序,不会经常使用数据层直接操作,采用实体层就没必要存在了,虽说存在了也没事!到于我不用的主要也有两个原因,一、实体层要随着数据模型的改变而改变,二、实体层如果是ORM框架生成的势必要用到实体属性的反射,这些反射用得让我有点望而生畏!

  回复  引用  查看    
#58楼2008-07-21 23:00 | Terry Sun      
@鹿亮
同感

  回复  引用  查看    
#59楼2008-07-21 23:02 | Terry Sun      
@姜敏
不用框架用什么,ADO.NET也是由微软提供的数据访问框架,现在什么都可以称为框架,到底什么是框架

  回复  引用  查看    
#60楼2008-07-22 00:03 | Vincent      
Nhibernate不用什么自动生成,全手写.那么多可配置属性,哪个自动生成的工具能体现出来?到最后还不是要自己找到对应项去改?

HQL??Nhibernate早就不推荐使用的东西了,完全Criteria查询.会Criteria确实可以不需要懂sql语句,它们可不是仅仅为了异构数据库的可移植性,而是为了开发人员使用OO的思维方式来处理二维关系表的问题,而不是在两种思维方式中来回的切换.别忘了ORM的本质.另外只要你写完了entity和mapping file,生成db包括更新db的工作NHibernate都可以帮你自动的完成,只是一个语句而已.但是这样智能方式的出现不代表你可以不懂数据库的理论.

变更类型到处修改??重构工具的主要用途之一就是做这个事情的,一点而已.

至于为什么要有xml,这是为了mapping file更加的灵活使用,改table的名字,字段的名字,只需要修改mapping file中的table name和column name就可以了,跟你的实体类,什么业务逻辑没有一点的关系.尤其是在先有db后有实体的情况下,db的存在根本影响不到你用oo的方式来思考你的entity的建立.

增加一个字段同时还要在UI上增加个input??这个是必然的吧,如果这种需求的变更所谓的框架都能够自动完成了,那估计就没我们什么事情了.

hibernate\nhibernate究竟是好是坏我不在这里评价.至于从新发明轮子的问题,最好在充分了解没有什么旧轮子可以复合你要求的情况下,再去发明新轮子吧,毕竟旧的轮子是经过时间和具体的项目检验过的.


  回复  引用  查看    
#61楼2008-07-22 01:10 | 爱在戏院前      
速度写出你的解决方案,不然小心夜里走路~~~
mark一下

  回复  引用  查看    
#62楼2008-07-22 08:41 | YuHui      
有同感啊
  回复  引用  查看    
#63楼[楼主]2008-07-22 09:27 | netcorner      
@Vincent
大致也明白hibernate设计意图了,得站在hibernate的角度去设计,所有需求改要,其实就是配置文件的改动,因为hibernate会帮你搞定所需一切改变(只要一个语句)是吗?xml文件是当数表格数据关系的说明,所有的核心及设计都是在hibernate中!也就是我们得用OO去思考及设计!有一点不明白是,实体类是会随着你的配置xml改变而改变的吗?(也只需写一个语句即可,是不是?)。hibernate确实有它不错的地方,而且经过了很多项目的证明,我不用它的大致原因是因为它运用了太多的反射(有点想明白的是,它的反射是去取xml文件的内容字段名,还是直接取实体的相关属性名?)。之前不太深入理解hibernate,Vincent看来对这个用得还是很熟的吗!非常感谢你给的评论!

  回复  引用  查看    
#64楼[楼主]2008-07-22 09:29 | netcorner      
@爱在戏院前
老大,你也太狠了吧!还得给我一点时间酝酿一下吧!而且我还是得上班的,时间都是在牙缝里挤出来的。你这弄得我好怕怕哦!

  回复  引用  查看    
#65楼2008-07-22 10:19 | 奔三2.8      
楼主为啥没有提到LINQ呢?前段时间用过Devexpress xpo 不知道楼主用过没有
随便说说啊

  回复  引用  查看    
#66楼[楼主]2008-07-22 10:21 | netcorner      
@奔三2.8
说来惭愧,不懂linq呢!只是有一点了解

  回复  引用  查看    
#67楼2008-07-22 14:43 | Klesh Wong      
是hql不是hsq,不喜欢hql可以用criteria,多表查询、子查询、projection都可以,不知道还有更复杂的?
不想和hbm打交道可以用activerecord

linq。。。至少目前来说还差几个级数啊。

  回复  引用  查看    
#68楼2008-07-22 16:38 | kuber      
每种解决问题的方法都有其问题域, 没有能包治百病的终极方法;
ORM的前提是先有对象, 再考虑持久化. 如果你习惯从数据库出发, ORM不适合你;
对于实体之间关系比较简单的应用, 我现在喜欢用ActiveRecord, i.e. SubSonic, 觉得很方便. LZ不妨了解了解, 也许能借鉴
希望能早日看到LZ的框架, 学习学习

  回复  引用  查看    
#69楼2008-07-22 21:50 | Eeyore      
Castle的都是好东西~ORM,MVC,IOC,AOP...NBA~
  回复  引用  查看    
#70楼2008-07-23 13:23 | wu.qiliang      
呵呵, 文章挺好, 评论更精彩。看到最后,感觉应该换个题目来讨论才对,用不用持久化不是目的,如何应对需求变更以及开发和运行的效率才是大家关心的根本。楼主可以归纳一下,把常见的场景归纳出来,大家再来讨论,各自的框架或者方法才有可比性。

本人和kiler一样,是倾向于代码生成的。一般的做法是归纳场景,然后开发出原型,再转换成模板。因为是基于团队最佳实践开发出的原型,整体效率会很高。另外,我们有一整套的MetaData来支持代码生成,可以说很丰富,基本的模块包含所有常见的特性,包括UI也是按照模板生成的。字段级别的变化重新生成就可以了,不需要手动编码。细节上,我们也使用实体类,但不是用反射而是依赖代码生成来做属性赋值。

话题还可以继续深入,期待大家的讨论 ;-)

  回复  引用    
#71楼2008-08-04 13:36 | tanjiazhang[未注册用户]
偶觉得现今框架的最高水平就是rails那样的无需配置的框架,按照一些约定俗成的规则,事情变得非常简单。
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1247461




相关文章:

相关链接: