??xml version="1.0" encoding="utf-8" standalone="yes"?>
最q网上看到这L帖子<<谁能告诉?/span>Hibernate有何优秀之处>> 作者给Z?/span>hibernate在实?/span>orm的诸多不满和怀疑。而且很多开发h员都有着q样疑问Q“怎么q个行东东Q我用v来就是不手呢??/span>Q“或许这个东东只是用来吹牛的?/span>”。然而,q或许很可能是因为,你习惯的架构模式开发策略ƈ不适合使用ormq种持久化模式。用了反而是加大复杂度降低性能和效率。比如,用惯?/span>resultsetQ喜Ƣ把resultset攑֜表示层作为展C的数据l构的h。这L开发h员因Z惯了二维表ؓ核心q行开发,对于Hibernateq样?/span>orm工具Ҏ没办法了解其优势了。但是这q不是说q种以二l表的架构模式就比较差了Q只是不同的模式有不同的优缺点就看所在的应用是否适合使用了。或怽׃直在使用q样的模式在开发应用,自己q没有意识到Q甚至一直以L方式可以适应M应用Q?/span>:-Q。反而被其他架构模式中才会用到的框架搞的晕头转向甚至被误对{事实上Q像前面提到的以二维表ؓ核心的架构被UC?/span>?/span>表模?/span>?/span>架构(设计)模式?/span>
何ؓ“表模块?/span>(table module)Q“处理某一个数据库表、视图或虚拟表中所有行为的业务逻辑l成的一个实例”。最初,我就是从马丁同学?/span>POEAA中得到的q个定义。在书中他被定义?/span>DomainLogic 层次或者该层次的一部分Q?/span>DomainLogic也就是其他架构模型中?/span>BizLogic层。与该模式相对应个还有完成相似功能的DomainModel以及TransactionScript模式。该层次的职责是专门处理业务逻辑?/span>
单的Ԍ所谓“表模块”就是以一个类对应数据库中一个表Q视图)的数据来l织业务逻辑。从设计层次表妙面上看这U结构很像经?/span>OO模型Q同h以不同对象对应不同逻辑。但是,它与领域建模不同之处在于Q它的对象ƈ不表CZ个问题领域对象在软gpȝ中的映射。而是表示对一l数据的处理逻辑Q而通常q组数据的结构是重数据库表或试图上的二维数据l构。当然也可以来自其他集成部分Q比如返回两位数据结构的webservice?/span>
q里l出个比较Ş象的例子Q?/span>
Q上图)感觉像比较标准的OO吧,好象一?/span>Contract的对象表C合同,?/span>Product表示产品Q还有他们之间的兌关系。但是其实现实给出几个方法的时候就看出区别了?/span>Product内部的数据其实就是一个两位结构的rowset。而不像真正的领域模型分析出来的表CZ?/span>Product的数据,Contract也是如此?/span>
你会发现tableModule的类中一个对象其实对应一个表的数据,其拥有的操作也有很多是多数据记录的。多数据记录的操作在真正的领域中往往应该攑֜cMManagerq样的实体中Q而不是业务实体本w?/span>
使用q种模式实现的业务逻辑层不像领域模型模式可以适应搞复杂度的逻辑。但是由于它更亲q于数据持久的二l表Q没有像领域模型那样需要复杂的ORM支持。书对于数据驱动的应用或模块非常适合?/span>POEAA中也已经l出了这U?/span>bizLogic最有效的持久层实现Q就?/span>table getwayQ当然也可以使用其他的方式比如“查询工厂”?/span>
事实上,最多用这U模式的情况是当后台数据源大部分都是一U两l甚臛_l数据结构的时候进行。比如一个极端的例子Q几乎没有业务)Q一个应用的复杂查询模块Q这U模块就是一个查询模型加上一l对数据q行排列l计qo?/span>TableModule?/span>
表模块还h很多特点Q处理的二维数据表将成ؓ代码的核心部分。所以,是否使用tableModuleq会取决于整个应用的其他部分是否对这U二l表提供强大的支持。(如上图)
优点Q?/span>持久层架构简单,在复杂度大的以数据ؓ核心的应用中开发效率极高。而且表模块能够识别的table多Q能够处?/span>table的组建工兯强,q种模型的能力越强?/span>
~点Q?/span>不能适应复杂的应用逻辑Q或者与表结构差别较大的应用逻辑。由于没有对内部的两位数据表Q?/span>tableQ进行有效标识的方式Q比如,无法快速简单的定使用table是否是需要的数据内容Q,对于大量l颗_的逻辑会增加其复杂度?/span>
其实java中的 rowset/jdbc resultsetQ?/span>.net中的 dateSet/dataTable都属于表模块操作的二l表。但是,׃.net?/span>GUI层面以及持久化层面对他自q?/span>二维?/span>?/span>的强大支持?/span> TableModule几乎成ؓMS.Net上的首选模式。这也就可以解释了,许多.net开发h员一直抱怨,看到dataset/dataTable泛滥Q甚臛_WebService中也是这栗?/span>java中却有所不同Q虽然有持久化用到的jdbc/resultSet的支持(事实?/span>jdbc/ado l出的接口都只直接适合TableModule。)Q然而其他方面就得可怜了。所以,使用javaq是以其他的bizLogic架构模式为好。除非你的逻辑真的很简单,单到?/span>resultSet攑֜jsp中都不会造成逻辑混ؕ。又或者你能够自己提供一套完整的 rowsetl徏框架?/span>